巧用SSH 命令飞传文件
2019-12-22河南刘建臣
河南 刘建臣
将Server1作为主服务器,Server2 和Server3 作 为被控制服务器,来说明如何从Server1 上对Server2 和Server3 进 行 远程批量操作,包括批量执行命令,批量分发文件等。
为了便于操作,在上述主机上分别执行“vim/etc/ssh/ssh_config”命令,在配置文件中将“port 22”修改为“port 9991”,将通讯端口进行修改。
为了保证顺利分发密钥,需要先将“PasswordAuthentication”的值修改为“no”,启用密码认证功能。为了便于演示,将“PermitRootLogin no”前面的“#”去掉,使用Root账户进行操作。
在“ListenAddress”栏中分别配置所需的监听地址,这里分别为 172.16.10.91,172 .16 .10 .92,172.16.10.93。再执行“/etc/init.d/sshd restart”命名,重启SSH 服务。执行“ssh-keygen -t rsa-C Server1.com”命令,连续点击回车,生成所需的密钥。执行“sshcopy-id -i/root/.ssh/id_rsa.pub "-p9991 root@172.16.10.92"”命令,输入Server2 上 的Root 账户,将密钥分发给Server2,其中的“-P”参数指定连接端口。执行“ssh-copyid -i/root/.ssh/id_rsa.pub"-p9991 root@172.16.10.93"”命令,输入Server3上的Root 账户,将密钥分发给Server3,其中的“-P”参数指定连接端口。
因为已经分发了密钥,所以在上述主机上分别执行“vim/etc/ssh/ssh_config”命令,在“PasswordAuthentication no”行的全面加上“#”号,禁止使用密码登录,之后重启SSH 服务使配置生效。在Serrver1 上执行“ssh root@172.16.10.92”和“ssh root@172.16.10.93”命令,可以利用密钥直接登录到Server2和Server3上。当然,在实际的生产环境中,为安全起见,尽量不要使用Root账户登录。
例如,可以在以上服务器上分别执行“useradd sshuser”命令,创建名为“sshuser”的账户。执行“echo "pass@123" | passwd--stdin sshuser”命令,为该账户设置密码。
执行“vim/etc/ssh/ssh_config”命令,在配置文件中将“PermitRootLogin no”前面的“#”号去掉,禁止Root 登录。在Serevr1 上执行“su -sshuser”命令,切换到该账户环境,再利用上述命令执行密钥的分发操作即可。
为了实现远程批量执行命令,可以设计一个简单的脚本来进行操作。在Server1 上执行“cat remotectrl.sh”命令,创建名为“remotectrl.sh”的脚本。在其中依次输入“#!/bin/bash”,“if [ $# -ne 1];then”,“echo "USAGE $0:{Please Command}"”,“exit 1”,“fi”语句,其作用是检测命令行是否带有参数,参数的数量必须为1。
参数就是需执行的命令,如没有附带任何参数,就弹出提示信息,告诉用户需要使用参数,其中的“$0”表示该脚本命令本身。
继续输入“Command="$1"”,“IP="172.16.10"”,“User=root”,“Port=9991”语句,将正确传输的参数提取出来,其中的“$1”参数包含表示需要执行的所有命令。赋予“Command”变量,并设置地址,用户名以及端口变量。继续输入“for i in 92 93”,“do”,“echo "##Server IS $IP."$i"###"”,“/usr/bin/ssh $User@$IP."$i"-p"$Port" "$Command"”,“done”语句。
其作用是执行一个循环,将目标主机IP 地址最后一位作为循环条件,例如这里目标主机的IP 为172.16.10.92 和172.16.10.93,就 将92,93作为循环的条件,来执行两次循环,当然,如果您需要控制的目标主机很多,可以添加更多的循环量。
进入循环后,先显示当前操作的远程主机的地址信息,再利用SSH 命令,使用预设的账户和端口,在目标主机上执行参数中包含的命令。
例如,执行“sh -x remotectrl.sh "df -h" "top " "netstat ""ifconfig eth0"”命令,就可以在Server2 和Server3主机上同时执行附带的所有命令。其中的“-x”参数表示使用调试模式,在实际使用时可以不使用该参数。因为这里已经实现了密钥认证,所以指定的命令可以立即在所有远程主机上运行。当然,在实际使用时,可以根据需要针对更多的主机,远程批量执行更多的命令。
上面分析了如何使用SSH 命令远程批量执行命令,按照同样的原理,可以针对多台主机批量传输文件。
我们知道,对于SSH 远程客户端来说,可以ssh,scp和sftp 命令,来实现远程登录,远程传输和下载文件的操作。例如使用scp 命令,就可以实现远程文件加密复制操作。
执行“scp-P22-pr/etc/data.txt root@172.16.10.91:/tmp/”命令,可以将指定的文件推送 到IP 为172.16.10.91 主机的“tmp”目录下。执行“scp -P22-pr root@172.16.10.91:/tmp/data.txt/root/”命令,可以将该目标主机上的“data.txt”文件下载到本地。
其中的“-P”参数指定SSH 连接端口,“-r”参数表示递归复制,“-p”参数表示保持文件的属性不变。这里就利用scp 命令,来实现远程文件的批量复制。在Server1 上执行“cat ssh_file.sh”命令,创建名为“deploy.sh”的脚本。在其中依次输入“#!/bin/bash”,“if [ $# -ne 2 ];then”,“echo "USAGE $0:{LocalF ile|RemoteFile}"”,“exit 1”,“fi”语句,其作用是判断该脚本后面是否跟随了两个参数,第一个参数为指定需要分发的本地文件路径,另一个参数指定为远程复制的文件路径。
继续输入“File1="$1"”,“ DirFile="$2 " ”,“IP="172.16.10"”,“User=root”,“Port=9991”语句,其作用是将两个参数的值分别传递给指定的变量,同时设置目标主机的IP 范围,以及连接的账户名和端口。继续输 入“for i in 92 93”,“do”,“echo "##Server IS$IP."$i"###"”,“/usr/bin/scp -rp -P"$Port" $File1$User@$IP."$i":"$DirFile"”,“done”语句,其作用是利用循环,使用预设的账户,利用scp 命令项目标主机上推送文件。