sheel远程执行
https://www.cnblogs.com/softidea/p/6855045.htmlshell远程执行:经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。 前提条件:配置ssh免密码登陆 对于简单的命令:如果是简单执行几个命令,则: ssh [email?protected] "cd /home ; ls" 基本能完成常用的对于远程节点的管理了,几个注意的点:
对于脚本的方式:? 有些远程执行的命令内容较多,单一命令无法完成,考虑脚本方式实现: #!/bin/bash ssh [email?protected] > /dev/null 2>&1 << eeooff cd /home touch abcdefg.txt exit eeooff echo done! 远程执行的内容在“<< eeooff ” 至“ eeooff ”之间,在远程机器上的操作就位于其中,注意的点:
http://www.cnblogs.com/ilfmonday/p/ShellRemote.html 目录?[隐藏]
SSH命令格式usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] [[email?protected]]hostname [command] 主要参数说明-l 指定登入用户 ssh控制远程主机,远程执行命令步骤第一步,设置ssh免认证,免认证就是不用密码认证就可以直接登录,这在写脚本服务器控制时特别有用。 每二步,就是到远端服务器上去执行命令 准备工作基于公私钥认证(可参考:Linux配置SSH密钥登录详解及客户端测试使用无密码登录)或者用户名密码认证(可参考:SSH使用expect自动输入密码、命令实现非交互式密码授权)能确保登录到远程服务器 基于公私钥认证远程登录可能存在的不足这个可以满足我们大多数的需求,但是通常运维部署很多东西的时候需要root权限,但是有几处限制: ssh 执行远程命令格式ssh [options] [[email?protected]]host [command] 其中,host为想要连接到的OpenSSH服务器(远程系统)的名称,它是惟一的必需参数。host可以是某个本地系统的名称,也可以是因特网上某个系统的FQDN(参见术语表)或者是一个IP地址。命令ssh host登录到远程系统host,使用的用户名与正在本地系统上使用的用户名完全相同。如果希望登录的用户名与正在本地系统上使用的用户名不同,那么就应该包含[email?protected]。根据服务器设置的不同,可能还需要提供口令。 打开远程shell如果没有提供command参数,ssh就会让你登录到host上去。远程系统显示一个shell提示符,然后就能够在host上运行命令。命令exit将会关闭与host的连接,并返回到本地系统的提示符。 例:命令行执行登录并且在目标服务器上执行命令 ssh [email?protected] "cd /home ; ls" 基本能完成常用的对于远程节点的管理了,几个注意的点: 例:在目标服务器上执行批量的命令。 #!/bin/bash ssh [email?protected] < < remotessh killall -9 java cd /data/apache-tomcat-7.0.53/webapps/ exit remotessh 远程执行的内容在"< < remotessh " 至" remotessh "之间,在远程机器上的操作就位于其中,注意的点:<< remotessh,ssh后直到遇到remotessh这样的内容结束,remotessh可以随便修改成其他形式。在结束前,加exit退出远程节点 如果不想日志文件在本机出现可以修改配置 ssh [email?protected] > /dev/null 2>&1 < < remotessh ssh的-t参数-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machine,which can be very useful,e.g. when implementing menu services. Multiple -t options force tty allocation,even if ssh has no local tty. 中文翻译一下:就是可以提供一个远程服务器的虚拟tty终端,加上这个参数我们就可以在远程服务器的虚拟终端上输入自己的提权密码了,非常安全 ssh -t -p $port [email?protected]$ip ‘cmd‘ 示例脚本 #!/bin/bash #变量定义 ip_array=("192.168.1.1" "192.168.1.2" "192.168.1.3") user="test1" remote_cmd="/home/test/1.sh" #本地通过ssh执行远程服务器的脚本 for ip in ${ip_array[*]} do if [ $ip = "192.168.1.1" ]; then port="7777" else port="22" fi ssh -t -p $port [email?protected]$ip "remote_cmd" done 这个方法还是很方便的,-t虚拟出一个远程服务器的终端,在多台服务器同时部署时确实节约了不少时间啊! 例:查看远程服务器的cpu信息 例:执行远程服务器的sh文件 #!/bin/bash uptime >> ‘uptime.log‘ exit 0 使用chmod增加可执行权限 chmod u+x uptimelog.sh 在本地调用远程的uptimelog.sh ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh" 执行完成后,在远程服务器的/home/www-online/中会看到uptime.log文件,显示uptime内容 [email?protected]:~$ tail -f uptime.log 21:07:34 up 288 days,8:07,1 user,load average: 0.05,0.19,0.31 例:执行远程后台运行sh #!/bin/bash while : do uptime >> ‘uptime.log‘ sleep 1 done exit 0 我们需要这个sh在远程服务器以后台方式运行,命令如下: [email?protected]:~$ ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &" [email?protected]‘s password: 输入密码后,发现一直停住了,而在远程服务器可以看到,程序已经以后台方式运行了。 [email?protected]:~$ ps aux|grep uptimelog.sh 1007 20791 0.0 0.0 10720 1432 ? S 21:25 0:00 /bin/bash /home/www-online/uptimelog.sh 原因是因为uptimelog.sh一直在运行,并没有任何返回,因此调用方一直处于等待状态。 ssh 调用远程命令后不能自动退出解决方法 [email?protected]:~$ ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh > /dev/null 2>&1 &" [email?protected]‘s password: [email?protected]:~$ 但这个ssh进程会一直运行在后台,浪费资源,因此我们需要自动清理这些进程。 实际上,想ssh退出,我们可以在ssh执行完成后kill掉ssh这个进程来实现。 #!/bin/bash ssh -f -n -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &" # 后台运行ssh pid=$(ps aux | grep "ssh -f -n -l www-online 192.168.110.34 /home/www-online/uptimelog.sh" | awk ‘{print $2}‘ | sort -n | head -n 1) # 获取进程号 echo "ssh command is running,pid:${pid}" sleep 3 && kill ${pid} && echo "ssh command is complete" # 延迟3秒后执行kill命令,关闭ssh进程,延迟时间可以根据调用的命令不同调整 exit 0 可以看到,3秒后会自动退出 [email?protected]:~$ ./ssh_uptimelog.sh [email?protected]‘s password: ssh command is running,pid:10141 ssh command is complete [email?protected]:~$ 然后查看远程服务器,可以见到uptimelog.sh 在后台正常执行。 [email?protected]:~$ ps aux|grep uptime 1007 28061 0.1 0.0 10720 1432 ? S 22:05 0:00 /bin/bash /home/www-online/uptimelog.sh 查看uptime.log,每秒都有uptime数据写入。 [email?protected]:~$ tail -f uptime.log 22:05:44 up 288 days,9:05,load average: 0.01,0.03,0.08 22:05:45 up 288 days,0.08 22:05:46 up 288 days,0.08 22:05:47 up 288 days,0.08 22:05:48 up 288 days,0.08 附录: 假设本地机器上配置了JAVA环境变量,在本地执行 echo $JAVA_HOME=/opt/jdk 假若我想查看远程机器上的JAVA环境变量,则只能使用单引号了,ssh?[email?protected] ‘ echo $JAVA ‘,则是’ ‘ 中的$JAVA不会被shell解析,而是当做一个字符串,此时参数 echo $JAVA 传递给了 ssh; 如果我们使用 ssh?[email?protected] ” echo $JAVA “,则 shell 首先会解析$JAVA,得到它的值,则该命令就变成了 ssh?[email?protected] ‘ echo /opt/jdk ‘ 了 2、可能遇到的问题 所以需要增加-t -t参数来强制伪终端分配,即使标准输入不是终端。 参考样例如下: 参考资料: http://www.3mu.me/linux%E4%B8%AD%E7%9A%84shell%E7%94%A8ssh%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%8E%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%E5%B9%B6%E8%87%AA%E5%8A%A8/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |