스폰-명령을 찾을 수 없습니다!


15

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

제 경우에는 예상 코드 주위에 EOD 마커가 필요했습니다. stackoverflow.com/questions/26125036/…
AnneTheAgile

답변:


20

스크립트가 두 개의 통역사를 결합하려고합니다. #!/bin/bash와 둘 다 #!/usr/bin/expect있습니다. 작동하지 않습니다. 둘 중 하나만 사용할 수 있습니다. bash처음 부터 스크립트가 bash 스크립트로 실행 중입니다.

그러나, 스크립트 내에서, 당신은 expect다음과 같은 명령을 spawn하고 send. 이 (가) 스크립트를 읽고 bash있지 않기 때문에 expect실패합니다. 다른 expect스크립트를 작성하고 스크립트에서 호출 bash하거나 전체를로 번역 하여이 문제를 해결할 수 있습니다 expect.

그러나 가장 좋은 방법은 간단한 텍스트 파일에서 암호를 일반 텍스트로 사용하는 끔찍한 습관을 피하는 대신 암호없는 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

1
ssh-agent를 시작하면 암호를 한 번만 입력하면됩니다. 그렇지 않으면 매번 입력해야합니다.
glenn jackman 12

5

코드는 훨씬 간결 할 수 있습니다.

#!/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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.