如何在远程机器上运行多个 SSH 命令并安全退出
ssh root@server2 "sync; sync; /sbin/shutdown -h now"
如何在远程 Unix 或 Linux 服务器上的 bash 中运行多个命令?在 bash shell 中通过 SSH 运行各种 unix 命令的最佳方法是什么?
在远程 Unix 服务器上运行多个命令的方法有很多种。本页展示了使用 bash shell 进行 ssh 和运行多个命令的最简单方法。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | 终端/ssh |
先决条件 | ssh 命令 |
操作系统兼容性 | BSD • Linux • macOS • Unix • WSL |
预计阅读时间 | 4 分钟 |
在远程机器上运行多个命令的简单 bash 语法
如果 command1 在名为 foo 的远程主机上成功,则只需运行 command2。语法如下:
$ ssh bar@foo "command1 && command2"
例如,以 'vivek' 用户身份在名为 'centos7' 的 Linux 机器上运行 uptime 命令和date 命令
$ ssh vivek@centos7 "uptime && date"
:
示例输出:
18:36:17 up 1 day, 8:14, 0 users, load average: 1.02, 1.06, 1.05 Fri Jun 7 18:36:17 IST 2019
为了避免sudo: Sorry, you must have a tty to run sudo错误,请将以下内容传递-t给 ssh:
$ ssh -t bar@foo "command1 && command2"
通过 SSH 以 sudo 身份运行多个命令
以下是使用apt 命令或apt-get 命令应用更新的方法:
$ ssh -t user@server sudo -- "sh -c 'apt update && apt upgrade -y'" # For example, ec2 Debian/Ubuntu server can be updated as follows # $ ssh -t ls.www-2 sudo -- "sh -c 'apt update && apt upgrade -y'"
点击放大
- ssh:使用 ssh 命令在远程机器上执行命令。
- -t:强制分配伪终端。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,并且可以避免错误。
- ls.www-2:托管在 Linode 或 AWS 云的远程服务器。
- sudo:在名为 的远程机器上运行 sudo 命令ls.www-2。
- --:双破折号“ --”表示“命令行标志结束”。它告诉 ssh 或任何其他有效的 shell 命令不要尝试解析命令行选项后面的内容。有关更多信息,请参阅“ SSH Shell 命令中的 ‐‐(双破折号)是什么意思? ”。
- sh -c 'apt update && apt upgrade -y':从命令字符串(' apt update && apt upgrade -y')操作数而不是标准输入读取命令。这是运行多个 shell 命令最安全的方法。了解如何在Linux 或 Unix 下使用 sudo 运行多个命令。
如何运行多个 SSH 命令
运行日期和主机名命令:
$ ssh user@host "date && hostname"
您可以在名为 server1.example.com 的远程框上运行 sudo 命令,如下所示:
$ ssh -t vivek@server1.example.com "sudo /sbin/shutdown -h now"
最后:
$ ssh root@server1.example.com "sync && sync && /sbin/shutdown -h now"
Bash 在此处记录运行多个 SSH 命令的语法
here document 语法告诉 shell 从当前源 (HERE) 读取输入,直到看到仅包含单词 (HERE) 的行:
ssh server1 << HERE command1 command2 HERE
以下是在远程系统上运行多个命令的另一个示例:
ssh vivek@server1.example.com << EOF date hostname cat /etc/resolv.conf EOF
使用 sudo 命令类型:
ssh -t vivek@server1.example.com << EOF sync sync sudo /sbin/shutdown -h 0 EOF
将脚本通过管道传输到远程服务器
最后,在本地服务器上创建一个名为“remote-box-commands.bash”的脚本,如下所示:
date hostname cat /etc/resolv.conf
在名为 nas02examplehomeserver 的远程服务器上按如下方式运行它:
$ cat remote-box-commands.bash | ssh user@nas02examplehomeserver
或
$ cat remote-box-commands.bash | ssh -t vivek@nas02examplehomeserver
如何 ssh 到多个服务器并运行命令
可以使用简单的bash for 循环,如下所示。在此示例中,在名为 box1、box2 和 box3 的三台 Linux 服务器上运行 uptime 命令:
for s in box1 box2 box3 do ssh vivek@${s} uptime done
在远程系统上运行本地 bash 脚本
创建一个shell脚本如下:
#!/bin/bash # Name: test.sh # Purpose: Run multiple commands on a remote box # ---------------------------------------------------- uptime date whoami
现在在名为 server1.example.com 的主机上按如下方式运行它:
$ ssh vivek@server1.example.com 'bash -s' < /path/to/test.sh
或者在四台服务器上运行它:
for s in server{1..4}.example.com do ssh vivek@${s} 'bash -s' < /home/vivek/bin/test.sh done
请注意,该-t选项将消除“抱歉,您必须有一个 tty 才能运行 sudo/在此处插入您的命令”错误消息。您还可以使用pssh(并行 ssh)在多个 Linux/Unix/BSD 服务器上并行执行 ssh。有关更多信息,请使用 man 命令或 help 命令查看 ssh 和 bash 命令手册页:
这样,您就可以仅使用 ssh 客户端/服务器模型运行多个 bash shell 命令。更好的选择是使用 ansible 工具。
$ man ssh
$ man bash
$ man sudo
$ sudo --help