找不到Spawn命令

时间:2014-01-16 00:16:36

标签: bash shell command expect spawn

我在尝试运行.sh文件时遇到错误

line 2: spawn: command not found
": no such file or directory
bash.sh: line 3: expect: command not found
bash.sh: line 4: send: command not found
#!/usr/bin/expect -f
spawn sftp -o IdentityFile=MyFile.ppk 500200243@XXX.XXX.XXX.XXX
expect "XXX.XXX.XXX.XXX.gatewayEnter passphrase for key 'MyFile.ppk.ppk':"
send "myPassword"

知道为什么会这样吗?

5 个答案:

答案 0 :(得分:8)

  1. 这是一个期望脚本,因此“.exp”将是一个合适的文件扩展名:mv bash.sh sftp.exp
  2. 不要像bash bash.shsh bash.sh那样启动它。做这个:
    1. 使程序可执行:chmod a+x sftp.exp
    2. 使用./sftp.exp/path/to/sftp.exp启动它,或将其移至$ PATH中的目录,然后使用sftp.exp启动它
  3. 在您send "myPassword"之后,您必须“点击输入”:send "myPassword\r"
  4. 在制定期望计划时,将exp_internal 1添加到顶部。
  5. 祝你好运,并回答其他问题。

答案 1 :(得分:3)

它适用于我(来自sftp:ssh: Could not resolve hostname XXX.XXX.XXX.XXX: Name or service not known的错误),尽管)脚本的.sh扩展名有点令人反感; - )

通常当发生这种无法解释/不可预测的行为时,这是因为脚本是在(notepad.exe)下编辑的,它使用\r\n来划分行。这会对 / 脚本造成严重破坏,因为预计只有\n作为行分隔符。

您可以使用the dos2unix and unix2dos utilities在两种格式之间进行转换。作为一个实验,我将您的脚本转换为“dos”格式,确实有类似的错误:

ubuntu@ubuntu:~$ unix2dos bash.sh 
unix2dos: converting file bash.sh to DOS format ...
ubuntu@ubuntu:~$ ./bash.sh 
": no such file or directory
ubuntu@ubuntu:~$ dos2unix bash.sh 
dos2unix: converting file bash.sh to Unix format ...
ubuntu@ubuntu:~$ ./bash.sh 
spawn sftp -o IdentityFile=MyFile.ppk 500200243@XXX.XXX.XXX.XXX
ssh: Could not resolve hostname XXX.XXX.XXX.XXX: Name or service not known
Couldn't read packet: Connection reset by peer
send: spawn id exp6 not open
    while executing
"send "myPassword""
    (file "./bash.sh" line 4)
ubuntu@ubuntu:~$ 

答案 2 :(得分:3)

似乎/ usr / bin / expect尚未安装在您的计算机中。所以你会得到'命令未找到'

使用which expect进行检查,并将其安装到正确的路径。

答案 3 :(得分:1)

这一切都取决于你如何调用命令。就像雷说的那样,即使你指定顶部有爆炸的环境,你仍然需要使用expect -f来运行它。

答案 4 :(得分:1)

我也遇到了同样的错误。它通过以下方式使用expect来解决:

DIRNAME=$(date +%F:%T)
expect_sh=$(expect -c "
spawn scp -r ABC xxx@yyy.yy.yy.yyy:/root/$DIRNAME
expect \"password:\"
send \"xxxx\r\"
expect \"#\"
spawn ssh -o StrictHostKeychecking=no xxx@yyy.yy.yy.yyy
expect \"password:\"<
send \"xxxx\r\"
expect \"#\"
send \"rm -f /root/$DIRNAME/abc.txt\r\"
expect \"#\"
send \"scp -r /root/$DIRNAME/* root@zzz.zz.zz.zzz:/root/ABC/\r\"
expect \"password:\"
send \"xxxxx\r\"
expect \"#\"
send \"exit \r\"
")<b

echo "$expect_sh"
相关问题