ssh远程执行命令方法和Shell脚本实例


写这篇博客之前,我google了一堆相关文章,大都是说修改/etc/sudoers,然后NOPASSWD:指定的cmd,但是真心不管用,没有远程虚拟终端这个方法就是浮云,ubuntu10.04 server 亲测!!

ssh执行远程操作
命令格式

ssh -p $port $user@$p 'cmd'  

  

$port : ssh连接端口号  

$user: ssh连接用户名  

$ip:ssh连接的ip地址  

cmd:远程服务器需要执行的操作

准备工作

基于公私钥认证或者用户名密码认证能确保登录到远程local2服务器(有点基本运维知识的人做这个事情都不是问题)
cmd如果是脚本,注意绝对路径问题(相对路径在远程执行时就是坑)

不足

这个命令可以满足我们大多数的需求,但是通常运维部署很多东西的时候需要root权限,但是有几处限制:
远程服务器local2禁止root用户登录
在远程服务器脚本里转换身份用expect需要send密码,这样不够安全

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 $user@$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 $user@$ip "remote_cmd"  

done

这个方法还是很方便的,-t虚拟出一个远程服务器的终端,在多台服务器同时部署时确实节约了不少时间啊!

Shell中的${}、##和%%使用范例
今天看一个脚本文件的时候有一些地方不太懂,找了一篇文章看了一些,觉得不错,保留下来。假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt可

Shell脚本逐行读取文本文件(不改变文本格式)
网上有很多shellscript读文本文件的例子,但是都没有讲出故事的全部,只说了一半。举个例子,比如从一个testfile文件中读取如下格式的文本行:$vitestfil

Shell脚本配合iptables屏蔽来自某个国家的IP访问
星期六我们一位客户受到攻击,我们的网络监测显示有连续6小时的巨大异常流量,我们立即联系了客户,没有得到回应,我们修改和限制了客户的VPS,