![编写登录和退出ssh服务器的脚本](https://linux22.com/image/76339/%E7%BC%96%E5%86%99%E7%99%BB%E5%BD%95%E5%92%8C%E9%80%80%E5%87%BAssh%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%84%9A%E6%9C%AC.png)
为了这个解释,机器是我的笔记本电脑,我用它连接到远程服务器 - 我将其称为服务器名称。
该过程可以描述如下:
- 我连接到服务器服务器名称与
ssh
来自机器 - 然后我插入密码服务器名称
- 我编译了一些东西服务器名称
- 我退出服务器名称(使用
exit
) - 然后我重新启动服务器名称从机器
- 我
ping
服务器名称然后我等到收到它的响应(ping
的输出显示在控制台上) - 我
ssh
进入服务器名称再次 - 我进行了一些检查
- 最后,我
exit
要服务器名称为了回到机器
为了完成上面的食谱,我手动运行以下命令机器:
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ cd /some/path/
<server_name>$ make clean > /dev/null
<server_name>$ make > /dev/null
<server_name>$ exit
<machine>$ ./my_reboot_script server_name
<machine>$ ping server_name
PING 10.23.22.7 with 56(84) bytes of data.
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
ping output... (not very interesting)...
^C
<machine>$ ssh server_name
insert password for server_name:
<server_name>$ ./run_some_checks
<server_name>$ exit
<machine>$ echo "Done!"
上面的几个注释按顺序排列:
-my_reboot_script
只是一个允许我冷重启的程序服务器名称从我自己的座位上来看。
- 冷重启后服务器名称,我需要等待它恢复,以便我可以使用 重新连接到它ssh
。为此,我使用ping
;它仅用作何时的指示服务器名称准备好再次接受连接;只有当我看到ping
输出最终在控制台上生成时,我才会使用 Ctrl+C 中断它,然后ssh
进入服务器名称。
手动执行上述操作既乏味又耗时。所以我想把上面的过程自动化,但是有三个难点:
- 连接到时服务器名称
exit
,从 shell发出命令会优雅地将我注销并返回到机器。但是,exit
从脚本.sh
文件内发出将终止脚本... - 我怎样才能自动输入密码服务器名称阶段?我不想手动输入密码,而是让脚本来完成;换句话说 - 我想以某种方式将密码硬编码到脚本中,这样它就不会打扰我。
- “等待服务器准备好 ssh 连接”阶段:如何自动化此操作?意思是,
ping
我希望脚本ping
识别出有来自服务器名称,然后连接ssh
。虽然,ping
在这里使用可能不是一个好主意,因为响应并ping
不能保证服务器名称已准备好监听连接(根据我对上述过程的经验,从获得ssh
第一个响应起,还需要几秒钟的时间)。ping
因此,更好的方法可能是让脚本继续尝试ssh
循环,直到授予访问权限(某种繁忙的等待机制,甚至是每隔几秒睡眠和唤醒以尝试连接的循环)。
答案1
如果您可以将公钥数据从您的计算机获取到服务器的.ssh/authorized_key
文件,则可以通过每个服务器的一次调用来运行编译ssh
,而无需输入密码:
ssh someone@$SERVER 'cd /some/path/; make clean > /dev/null; make > /dev/null;'
SERVER
您可以将其放入 shell 脚本的循环中,每次都更改 shell 变量的值。如果您不介意每次ssh
调用时输入密码,您甚至不需要服务器上的公钥数据。