我有这段代码:
#!/bin/sh
if [ "upload" == $1 ];then
expect -c <<'END_EXPECT'
set timeout -1
spawn sftp -i /Users/myuser/.ssh/private.key root@dev.site.org
expect "sftp>"
send "put dirname $0/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3\r"
expect "%100"
send "quit\r"
expect eof
END_EXPECT
elif [ 'download' == $1 ];then
expect -c <<'END_EXPECT'
set timeout -1
spawn sftp login_name@1.2.3.4
expect "[Pp]assword:"
send "login_password\r"
expect "sftp>"
send "get /remote_path/$2/$3 dirname $0/$2/$3 \r"
expect "%100"
send "quit\r"
expect eof
END_EXPECT
fi
然而,它抛出了这个错误:
expect: option requires an argument -- c
usage: expect [-div] [-c cmds] [[-f] cmdfile] [args]
我在OSX 10.9中。为什么不工作?我以前从未用过期待......
答案 0 :(得分:2)
在here-doc
中传递expect脚本时取出-c
此外,您引用了here-doc终结词:<<'END_EXPECT'
这意味着嵌入其中的shell变量将不会扩展
你有这个问题:
send "put dirname $0/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3\r"
当期待抱怨can't read "2": no such variable
等
这里有一个重写,修复了here-doc问题,你的&#34; dirname&#34;问题并添加缩进以保持清晰:
#!/bin/sh
if [ "upload" == "$1" ];then
expect <<END_EXPECT
set timeout -1
spawn sftp -i /Users/myuser/.ssh/private.key root@dev.site.org
expect "sftp>"
send "put $(dirname $0)/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3\r"
expect "%100"
send "quit\r"
expect eof
END_EXPECT
elif [ 'download' == "$1" ];then
expect <<END_EXPECT
set timeout -1
spawn sftp login_name@1.2.3.4
expect "[Pp]assword:"
send "login_password\r"
expect "sftp>"
send "get /remote_path/$2/$3 $(dirname $0)/$2/$3 \r"
expect "%100"
send "quit\r"
expect eof
END_EXPECT
fi
此外,您可能根本不需要期望:
case "$1" in
upload)
cmd="put $(dirname $0)/$2/$3 /var/www/localhost/htdocs/dev1.site.org/$2/$3"
;;
download)
cmd="get /remote_path/$2/$3 $(dirname $0)/$2/$3"
;;
esac
echo "$cmd" | sftp -i /Users/myuser/.ssh/private.key root@dev.site.org