使用expect脚本在远程服务器上执行本地shell脚本(不在远程服务器上复制它)

时间:2011-12-05 09:07:56

标签: shell expect

我是脚本世界的新手。使用expect脚本在远程服务器上执行本地shell脚本时出现问题。 我的脚本正在关注

VAR=$(/home/local/RD/expect5.45/expect -c "
spawn -noecho ssh -q -o StrictHostKeyChecking=no $USER@$HOST $CMD
match_max 100000
expect \"*?assword:*\"
send -- \"$PASS\r\"
send -- \"\r\"
send  \"exit\n\r\"
expect eof
")

如果CMD是df -kh;top之类的基本命令,它工作正常。 但是我需要在远程服务器上收集几个我创建了shell脚本的统计信息。 我试过没有运气

spawn -noecho ssh -q -o StrictHostKeyChecking=no $USER@$HOST 'bash -s' < localscript.sh

它无法在远程服务器上选择和执行localscript。 请帮助解决此问题。

1 个答案:

答案 0 :(得分:0)

上次我尝试过这样的事情时,我很快就厌倦了使用expect(1)来尝试正确回复密码提示。当我最终花了十分钟来学习如何create an ssh keycopy the key to the remote systemset up the ssh-agent来使基于密钥的登录更容易自动化时,我从未遇到过远程运行脚本的问题:

ssh remotehost "commands ; go ; here"

首先,检查您是否需要创建密钥,或者您是否已经拥有密钥:

ls -l ~/.ssh/id_*

如果没有列出文件,请运行:

ssh-keygen

并回答提示。

生成密钥后,将其复制到远程系统:

ssh-copy-id remote

大多数现代系统在桌面启动时运行ssh-agent(1);要确定您是否已启动代理,请运行:

ssh-add -l

如果您看到“代理人没有身份。”,那么您很高兴。如果您看到“无法打开与身份验证代理的连接”。那么你将不得不对将ssh-agent(1)插入你的环境的最佳位置进行一些研究。或者,完全放弃代理,这只是一个很好的方便。

添加你的密钥,可能会超时,因此它只在短时间内有效:

ssh-add -t 3600

现在测试一下:

ssh remote "df -hk ; ps auxw ; ip route show ; free -m"

expect(1)绝对是一个简洁的工具,但使用SSH密钥可以更轻松(更安全地)在远程系统上进行身份验证。