我在尝试运行.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"
知道为什么会这样吗?
答案 0 :(得分:8)
mv bash.sh sftp.exp
bash bash.sh
或sh bash.sh
那样启动它。做这个:
chmod a+x sftp.exp
./sftp.exp
或/path/to/sftp.exp
启动它,或将其移至$ PATH中的目录,然后使用sftp.exp
启动它send "myPassword"
之后,您必须“点击输入”:send "myPassword\r"
exp_internal 1
添加到顶部。答案 1 :(得分:3)
它适用于我(来自sftp:ssh: Could not resolve hostname XXX.XXX.XXX.XXX: Name or service not known
的错误),尽管expect(tcl)脚本的.sh
扩展名有点令人反感; - )
通常当发生这种无法解释/不可预测的行为时,这是因为脚本是在windows(notepad.exe)下编辑的,它使用\r\n
来划分行。这会对unix / linux脚本造成严重破坏,因为预计只有\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"