빌드 - 명령을 찾을 수 없습니다!

빌드 - 명령을 찾을 수 없습니다!

저는 Mac OS X 10.9.4를 사용하고 있으며 아래는 로컬 컴퓨터에서 다른 호스트로 파일을 복사하는 스크립트입니다.

#!/bin/bash
#!/usr/bin/expect

echo "I will fail if you give junk values!!"
echo " "
echo "Enter file name: "
read filePath
echo " "
echo "Where you want to copy?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
read choice
echo " "
if [ $choice -eq "1" ]
then
  spawn scp filePath uname@host1:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
elif [ $choice -eq "2" ]
then
  spawn scp filePath uname@host2:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
elif [ $choice -eq "3" ]
then
  spawn scp filePath uname@host3:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
else
  echo "Wrong input"
fi

이 스크립트를 실행할 때 나는 다음과 같습니다

./rcopy.sh: line 21: spawn: command not found
couldn't read file "password": no such file or directory
./rcopy.sh: line 23: send: command not found
./rcopy.sh: line 24: interact: command not found

답변1

귀하의 스크립트는 두 개의 통역사를 결합하려고 합니다. 당신은 #!/bin/bash과 을 둘 다 가지고 있습니다 #!/usr/bin/expect. 그건 작동하지 않습니다. 둘 중 하나만 사용할 수 있습니다. 처음 부터 bash스크립트는 bash 스크립트로 실행됩니다.

그러나 스크립트에는 및 와 expect같은 명령이 있습니다 . 스크립트를 읽는 대신 읽는 중이기 때문에 실패합니다 . 다른 스크립트를 작성 하고 스크립트 내에서 호출하거나 전체 스크립트를 .spawnsendbashexpectexpectbashexpect

하지만 가장 좋은 방법이자 간단한 텍스트 파일에 일반 텍스트로 비밀번호를 저장하는 나쁜 습관을 피하는 방법은 비밀번호 없는 SSH를 설정하는 것입니다. 이렇게 하면 scp비밀번호가 필요하지 않으며 다음이 필요하지 않습니다 expect.

  1. 먼저 컴퓨터에 공개 SSH 키를 만듭니다.

    ssh-keygen -t rsa
    

    로그인 후 처음으로 ssh 명령을 실행할 때마다 비밀번호를 묻는 메시지가 표시됩니다. 즉, 여러 ssh 또는 scp 명령을 한 번만 입력하면 됩니다. 완전한 비밀번호 없는 액세스를 위해서는 비밀번호를 공백으로 남겨두세요.

  2. 공개 키를 생성한 후 네트워크의 모든 컴퓨터에 복사합니다.

    while read ip; do 
     ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip 
    done < IPlistfile.txt
    

    파일 IPlistfile.txt은 각 줄에 서버 이름이나 IP가 포함되어야 합니다. 예를 들어:

    host1
    host2
    host3
    

    이 작업을 처음 수행하는 것이므로 각 IP에 대한 비밀번호를 수동으로 입력해야 하지만, 일단 완료하면 간단한 조작으로 해당 컴퓨터 중 어느 곳에나 파일을 복사할 수 있습니다. :

    scp file user@host1:/path/to/file
    
  3. 스크립트에서 기대치를 제거하십시오. 이제 비밀번호 없이 액세스할 수 있으므로 다음과 같이 스크립트를 사용할 수 있습니다.

    #!/bin/bash
    echo "I will fail if you give junk values!!"
    echo " "
    echo "Enter file name: "
    read filePath
    echo " "
    echo "Where you want to copy?"
    echo "Enter"
    echo "1. if Host1"
    echo "2. if Host2"
    echo "3. if Host3"
    read choice
    echo " "
    if [ $choice -eq "1" ]
    then
      scp filePath uname@host1:/usr/tmp   
    elif [ $choice -eq "2" ]
    then
      scp filePath uname@host2:/usr/tmp   
    elif [ $choice -eq "3" ]
    then
      scp filePath uname@host3:/usr/tmp   
    else
      echo "Wrong input"
    fi
    

답변2

코드를 더 간결하게 만들 수 있습니다.

#!/bin/bash

read -p "Enter file name: " filePath
if ! [[ -r $filePath ]]; then
    echo "cannot read $filePath"
    exit 1
fi

PS3="Where you want to copy? "
select host in host1 host2 host3; do
    if [[ -n $host ]]; then
        expect <<END
            spawn scp "$filePath" uname@$host:/usr/tmp   
            expect "password"   
            send "MyPassword\r"
            expect eof
END
        break
    fi
done

제안된 대로 SSH 키를 설정하면 더 좋습니다.

    if [[ -n $host ]]; then
        scp "$filePath" uname@$host:/usr/tmp   
        break
    fi

답변3

spawnexpect명령 이다. 통역사가 있으면 작동하지 않습니다 /bin/bash.

관련 정보