#!/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[*]}
if [ $ip = "192.168.1.1" ]; then
port="7777"
port="22"
ssh -t -p $port $user@$ip "remote_cmd"
这个方法还是很方便的,-t虚拟出一个远程服务器的终端,在多台服务器同时部署时确实节约了不少时间啊!
例:查看远程服务器的cpu信息
假设远程服务器IP是192.168.110.34
ssh -l www-online 192.168.110.34 “cat /proc/cpuinfo”
例:执行远程服务器的sh文件
首先在远程服务器的/home/www-online/下创建一个uptimelog.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内容
www-online@nmgwww34:~$ tail -f uptime.log
21:07:34 up 288 days, 8:07, 1 user, load average: 0.05, 0.19, 0.31
例:执行远程后台运行sh
首先把uptimelog.sh修改一下,修改成循环执行的命令。作用是每一秒把uptime写入uptime.log
#!/bin/bash
while :
uptime >> 'uptime.log'
sleep 1
exit 0
我们需要这个sh在远程服务器以后台方式运行,命令如下:
ssh -l www-online 192.168.110.34 “/home/www-online/uptimelog.sh &”
www-online@onlinedev01:~$ ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh &"
www-online@192.168.110.34's password:
输入密码后,发现一直停住了,而在远程服务器可以看到,程序已经以后台方式运行了。
www-online@nmgwww34:~$ 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一直在运行,并没有任何返回,因此调用方一直处于等待状态。
我们先kill掉远程服务器的uptimelog.sh进程,然后对应此问题进行解决。
ssh 调用远程命令后不能自动退出解决方法
可以将标准输出与标准错误输出重定向到/dev/null,这样就不会一直处于等待状态。
ssh -l www-online 192.168.110.34 “/home/www-online/uptimelog.sh > /dev/null 2>&1 &”
www-online@onlinedev01:~$ ssh -l www-online 192.168.110.34 "/home/www-online/uptimelog.sh > /dev/null 2>&1 &"
www-online@192.168.110.34's password:
www-online@onlinedev01:~$
但这个ssh进程会一直运行在后台,浪费资源,因此我们需要自动清理这些进程。
实际上,想ssh退出,我们可以在ssh执行完成后kill掉ssh这个进程来实现。
首先,创建一个sh执行ssh的命令,这里需要用到ssh的 -f 与 -n 参数,因为我们需要ssh也以后台方式运行,这样才可以获取到进程号进行kill操作。
创建ssh_uptimelog.sh,脚本如下
#!/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秒后会自动退出
www-online@onlinedev01:~$ ./ssh_uptimelog.sh
www-online@192.168.110.34's password:
ssh command is running, pid:10141
ssh command is complete
www-online@onlinedev01:~$
然后查看远程服务器,可以见到uptimelog.sh 在后台正常执行。
www-online@nmgwww34:~$ 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数据写入。
www-online@nmgwww34:~$ tail -f uptime.log
22:05:44 up 288 days, 9:05, 1 user, load average: 0.01, 0.03, 0.08
22:05:45 up 288 days, 9:05, 1 user, load average: 0.01, 0.03, 0.08
22:05:46 up 288 days, 9:05, 1 user, load average: 0.01, 0.03, 0.08
22:05:47 up 288 days, 9:05, 1 user, load average: 0.01, 0.03, 0.08
22:05:48 up 288 days, 9:05, 1 user, load average: 0.01, 0.03, 0.08
附录:
1、单引号和双引号在ssh命令中的区别:
以一个例子来说明问题,
假设本地机器上配置了JAVA环境变量,在本地执行 echo $JAVA_HOME=/opt/jdk
假若我想查看远程机器上的JAVA环境变量,则只能使用单引号了,ssh user@node ‘ echo $JAVA ‘, 则是’ ‘ 中的$JAVA不会被shell解析,而是当做一个字符串,此时参数 echo $JAVA 传递给了 ssh;
如果我们使用 ssh user@node ” echo $JAVA “,则 shell 首先会解析$JAVA,得到它的值,则该命令就变成了 ssh user@node ‘ echo /opt/jdk ‘ 了
2、可能遇到的问题
问题:远程登录主机时出现Pseudo-terminal will not be allocated because stdin is not a terminal. 错误
解决方案:字面意思是伪终端将无法分配,因为标准输入不是终端。
所以需要增加-t -t参数来强制伪终端分配,即使标准输入不是终端。
to force pseudo-tty allocation even if stdin isn’t a terminal.
参考样例如下:
ssh -t -t user1@host1 -p 9527
shell远程执行: 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。前提条件: 配置ssh免密码登陆对于简单的命令: 如果是简单执行几个命令,则:ssh user@remoteNode "cd /home ; ls" 基本能完成常用的对于远程节...
本篇文章主要使用expect脚本来实现自动连接远程服务器并实现交互,不会大篇幅介绍expect的用法,有兴趣的读者可以自己了解,expect是个很强大的实现自动化交互的工具哦~~
使用expect可以不用输入密码,避免重复劳动。
那什么是expect?
查了一下,expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。
在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提.
是一种安全通道协议
对通信数据进行了加密处理,用于远程管理
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH为建立在应用层基础上的安全协议。
SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补
shell远程执行:
经常需要
远程到其他节点上
执行一些
shell命令,如果分别
ssh到每台主机上再去
执行很麻烦,因此能有个集
中管理的方式就好了。一下介绍两种
shell命令
远程执行的方法。
前提条件:
配置
ssh免密码登陆
对于简单的命令:
如果是简单
执行几个命令,则:
ssh user@remoteNode "cd /home ; ls"
-T Disable pseudo-terminal allocation.
-t Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine,
shell脚本控制远端服务器,使用ssh登陆服务器,使用expect命令进行交互
expect命令说明
1.expect是Linux中的一种交互的命令,借助expect实现脚本的自动化。
2.except中的spawn命令,用来创建新的进程
spawn ssh $user@ip 创建ssh 链接。
3.send和expect和spawn创建的进程进行交互,expect等待接受数据,send向spawn创建的进程发送数据。
4.设置超时时间 set timeout -1或者使用exp_contiue,防止e
ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dl
ctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dh
ctrl + k 删除光标后面所有字符相当于VIM里d shift+$
ctrl + u 删除光标前面所有字符相当于VIM里d shift+^
ctrl + w 删除光标前一个单词相当于VIM里db
ctrl + y 恢复ctrl+u上次
执行时删除的字符
ctrl + ? 撤消前一次输入
目的是实现shell脚本通过SSH获取另外一台终端输出,这样就可以快速的获取到另外一台终端的各种信息。 百度后参考了一些代码,假设我想要获取另一台终端的语言环境,远程执行locale,具体的执行的远程指令可以随意设置,这个脚本为基础,脚本代码如下:
调用方法./ssh.sh 192.168.1.1...
ssh是一种远程登录的命令。
我们可以用这个命令实现在A主机上输入命令,然后让B主机执行命令
但ssh又分为两种,一种是密码登录,一种是密钥登录,今天就说下密钥登录(不需要密码登录)
这里就介绍一下ssh -t rsa登录,这里先说一下,公钥和私钥是一对的,所以私钥可以解开公钥。
原理图如下
但凡使用ssh命令登录,只要不使用秘钥,就算自己登录自己,也是需要密码的。
这里就用slaver自...
公司开发使用docker,每次登陆自己开发机总要输入
ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错。作为一个懒人,肯定要找一个取巧的方式,查看了下
ssh命令,由于它要进行一次跟
服务器的加密交互,所以没有直接附带密码登陆的选项,只好作罢。
前些天在同事进行技术分享时,看到他竟然只输入了一行命令./test.sh就成功登陆了开发机,甚...