经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。所以介绍几种shell命令远程执行的方法。
前提条件:配置shell免密登录
执行单条命令
ssh user@remoteNode "df -h"
执行多条命令
ssh user@remoteNode "cd /home ; ls" #双引号,必须有。如果不加双引号,第二个ls命令在本地执行;分号,两个命令之间用分号隔开
执行需要交互的命令
ssh user@remoteNode "sudo ls /root"
sudo: sorry, you must have a tty to run sudo
-------------------------------------------------------------------------------------------------
ssh user@remoteNode "top"
TERM environment variable not set.
这两条命令虽然提示的失败原因不同,但它们有一个共同点:都需要与用户交互(需要 TTY)。所以它们失败的原因也是相同的:
默认情况下,当你执行不带命令的 ssh 连接时,会为你分配一个 TTY。因为此时你应该是想要运行一个 shell 会话。
但是当你通过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会立即退出远程主机,所以需要交互的命令也随之结束。
好在我们可以通过 -t 参数显式的告诉 ssh,我们需要一个 TTY 远程 shell 进行交互!
添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。
ssh user@remoteNode "sudo ls /root"
sudo: sorry, you must have a tty to run sudo #必须分配一个终端
ssh -t user@remoteNode "sudo ls /root"
[sudo] password for user: #加-t选项后成功,输入用户密码
2.脚本方式:
2.1执行本地脚本
ssh user@remoteNode < test.sh
2.2向脚本传递参数
ssh user@remoteNode 'bash -s' < test.sh age
2.3执行远程服务器上的脚本
ssh user@remoteNode "/tmp/test.sh" #写脚本的绝对路径
2.4执行远程服务器上的脚本并带参数
ssh user@remoteNode "/tmp/test.sh arguement"
- 示例2:
初始化系统环境。在test.sh脚本中编写:关闭selinux命令、关闭iptables、修改hosts文件、安装jdk环境等。
#!/bin/bash
#变量定义
ip_array=("192.168.1.1" "192.168.1.2" "192.168.1.3")
user="tester"
remote_cmd="/home/test.sh"
for ip in ${ip_array[@]}
do
ssh -t -p $port $user@$ip "remote_cmd"
done
命令使用方法
ssh [-p port] [user@]hostname [command]
port : ssh连接端口号
user: ssh连接用户名
ip:ssh连接的ip地址
cmd:远程服务器需要执行的操作
其他选项:
-t:强制分配一个伪终端,可以在远程机器上执行任何全屏幕(screen-based)程序,所以非常有用,例如菜单服务。双t选项(-tt)的意思是强制分配终端,即使ssh没有本地终端。
-T:禁止分配伪终端。
-q:静默模式,忽略所有警告和诊断信息。