如何在bash脚本中使用ssh?

84

我正在尝试在脚本中创建ssh连接并在远程服务器上执行一些操作。

但是终端提示我输入密码,然后在终端窗口而不是脚本中打开连接。命令直到我退出连接才被执行。

如何在bash脚本中使用ssh连接?


你需要做的是为脚本运行的用户交换SSH密钥。可以参考这个教程。这样做后,你的脚本将无需输入密码即可运行。但出于安全考虑,不建议为root用户这样做! - Dan Soap
4个回答

87
  1. 如果你希望密码提示框消失,那么使用基于密钥的身份验证(在这里描述)。

  2. 要通过ssh远程运行命令,你必须将它们作为ssh的参数,像下面这样:

root@host:~ # ssh root@www 'ps -ef | grep apache | grep -v grep | wc -l'


7
如果我有多行代码(只是为了清晰明了),我该如何传递给ssh? - blong
17
使用分号作为命令分隔符。 cd /var/www; cp foo bar; - halfdan
4
你可以尝试使用一个"heredoc"(定界符), 在这里查看详细信息:https://dev59.com/z2855IYBdhLWcg3wUSgW#4412338。 - user5359531
1
已经大约四年了,所以我现在已经熟悉heredocs :) 不过,还是感谢@user5359531分享这个! - blong

24

如果您想继续使用密码而不是使用密钥交换,那么可以使用 "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: bad interpreter: No such file or directory - Hamza Saeed
2
@HamzaSaeed - 首先你需要安装expect解释器,尝试运行“sudo apt-get install expect”,然后重试。此外,当我在Windows上从上面复制和粘贴解释器行时遇到了问题,请尝试手动在脚本中输入它。 - user3470887

6

还有一种使用共享连接的方法,即:某人使用密码发起连接,每个随后的连接都将在同一通道上进行复用,从而避免重新认证的需要。(并且速度更快)

# ~/.ssh/config 
ControlMaster auto
ControlPath ~/.ssh/pool/%r@%h

然后您只需登录,只要您已登录,Bash脚本就可以打开SSH连接。

当有人尚未打开通道时,您可以通过以下方式停止脚本的工作:

ssh ... -o KbdInteractiveAuthentication=no ....

-2
您可以使用以下bash脚本进行执行。
请确保将"$remote_command"替换为您要执行的指定命令。
ssh -p "$remote_port" "$remote_user@$remote_host" "$remote_command"

3
有关自我推广的更多参考,请阅读帮助中心中相关文章。归因是很好的,但是刻意寻找一个2009年发布并且从2013年以来没有活动的问题,只为了发布你的链接并不是明智之举。 - Adriaan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接