如何从 bash 脚本中 ssh?
Posted
技术标签:
【中文标题】如何从 bash 脚本中 ssh?【英文标题】:How to ssh from within a bash script? 【发布时间】:2010-12-26 02:17:31 【问题描述】:我正在尝试创建一个 ssh 连接并从脚本中在远程服务器上做一些事情。
但是终端提示我输入密码,然后在终端窗口而不是脚本中打开连接。在我退出连接之前,这些命令不会被执行。
【问题讨论】:
【参考方案1】:您需要为运行脚本的用户交换 SSH 密钥。看看this tutorial
完成此操作后,您的脚本将无需输入密码即可运行。但是,为了安全起见,您不想为 root 用户执行此操作!
【讨论】:
【参考方案2】:如果您希望密码提示消失,请使用基于密钥的身份验证 (described here)。
要通过 ssh 远程运行命令,您必须将它们作为 ssh 的参数提供,如下所示:
root@host:~ # ssh root@www 'ps -ef | grep 阿帕奇 | grep -v grep | wc -l'
【讨论】:
如果我有多行(只是为了代码清晰),我该如何将它传递给 ssh? 使用分号作为命令分隔符。cd /var/www; cp foo bar;
@blong 你可以试试heredoc,见这里:***.com/a/4412338/5359531
已经有 4 年了,所以我现在才知道 heredocs :) 不过,感谢分享这个 @user5359531 !【参考方案3】:
如果您想继续使用密码而不是使用密钥交换,那么您可以使用 'expect' 来完成此操作,如下所示:
#!/usr/bin/expect -f
spawn ssh user@hostname
expect "password:"
sleep 1
send "<your password>\r"
command1
command2
commandN
【讨论】:
-bash: ./test.sh: /usr/bin/expect: 错误的解释器:没有这样的文件或目录【参考方案4】:还有另一种使用共享连接的方法,即:有人使用密码启动连接,然后每个后续连接都将在同一通道上多路复用,从而无需重新验证。 (而且速度也更快)
# ~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/pool/%r@%h
那么你只需要登录,只要你登录了,bash脚本就能打开ssh连接。
然后,当有人尚未打开频道时,您可以通过以下方式停止脚本工作:
ssh ... -o KbdInteractiveAuthentication=no ....
【讨论】:
以上是关于如何从 bash 脚本中 ssh?的主要内容,如果未能解决你的问题,请参考以下文章