【发布时间】:2019-02-21 15:57:22
【问题描述】:
好的,所以我想做的是有一个脚本,我从本地(1)执行,ssh 到远程(1)和 rsync /path/to/file 到远程(2)/path/到/文件
#!/usr/bin/expect
set oldIP "[lrange $argv 0 0]"
set newIP "[lrange $argv 1 1]"
set password "123..."
set admin "User"
set host localhost
spawn ssh '$admin'@'$oldIP'
expect -exact "Password: "
sleep 3
send -- "$password\r"
expect -exact "$host:~ user# "
send -- "rsync -azvH --numeric-ids -W --force /path/ '$newIP':/path/"
expect -exact "Password: "
sleep 3
send -- "$password\r"
sleep 1
send -- quit\n"
【问题讨论】:
-
如果您使用的是 RSA 密钥身份验证而不是密码,那么您根本不需要使用
expect——它只是ssh -A admin@host1 "rsync -azvH --numeric-ids -W --force /path host2:/path"(主要是;转义主机名以抵抗 shell 注入尝试是一个单独的问题,但我们已经在这里介绍了)。-A启用代理转发,因此远程rsync可以使用存储在本地代理中的密钥对最终目标主机进行身份验证。 -
(您的最后一次发送缺少
")。您需要添加一个最终的interact或类似的内容以等待rsync 完成,否则您将过早关闭ssh 连接。