我在尝试运行.sh文件时出错
第 2 行:生成:找不到命令":没有这样的文件或目录bash.sh:第 3 行:期望:找不到命令bash.sh:第 4 行:发送:找不到命令
#!/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"
知道为什么会这样吗?
- 这是一个期望脚本,因此".exp"将是一个合适的文件扩展名:
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 "myPasswordr"
- 在开发期望程序时,将
exp_internal 1
添加到顶部。
祝你好运,并带着进一步的问题回来。
它对我来说工作正常(来自 sftp 的错误:ssh: Could not resolve hostname XXX.XXX.XXX.XXX: Name or service not known
),尽管期望 (tcl) 脚本的.sh
扩展有点令人反感;-)
通常,当发生这种无法解释/不可预测的行为时,这是因为脚本是在窗口(记事本.exe)下编辑的,该窗口使用rn
来分隔行。 这会对 unix/linux 脚本造成严重破坏,因为只有 n
作为行分隔符。
您可以使用dos2unix
和unix2dos
实用程序在两种格式之间进行转换。 作为实验,我将您的脚本转换为"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:~$
似乎/usr/bin/expect 尚未安装在您的机器中。所以你会得到"找不到命令"
使用which expect
进行检查,并将其安装到正确的路径。
我也遇到了同样的错误。 通过以下方式使用 expect 解决了这个问题:
DIRNAME=$(date +%F:%T)
expect_sh=$(expect -c "
spawn scp -r ABC xxx@yyy.yy.yy.yyy:/root/$DIRNAME
expect "password:"
send "xxxxr"
expect "#"
spawn ssh -o StrictHostKeychecking=no xxx@yyy.yy.yy.yyy
expect "password:"<
send "xxxxr"
expect "#"
send "rm -f /root/$DIRNAME/abc.txtr"
expect "#"
send "scp -r /root/$DIRNAME/* root@zzz.zz.zz.zzz:/root/ABC/r"
expect "password:"
send "xxxxxr"
expect "#"
send "exit r"
")<b
echo "$expect_sh"
这完全取决于您调用命令的方式。 就像 ray 说的,即使你在顶部指定了一个爆炸的环境,你仍然必须使用 expect -f 来运行它。