一个简单好用的ssh远程执行命令的脚本

运维经常需要到其他机器上执行命令,copy等操作。其实也有很多工具可以实现的,如jenkins、saltstack、ansible等等。这样还需要安装工具什么的。下面的小脚本不需要任何工具。先实现copy和执行命令吧。

好了,直接看脚本吧。

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
COMMAND=$1
shift

SLAVES=$1
shift

#distribute files
if [ $COMMAND == "distribute" ] || [ $COMMAND == "copy" ];then
SRC=$1
shift

DEST=$1
shift

if [ -f $SLAVES ];then
cat $SLAVES | while read slave
do
#已#开头的注释可略过
echo "$slave" | grep -q "^#"
if [ $? -eq 0 ] ; then
continue;
fi

echo "===================$slave================="
scp -r -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no $SRC $slave:$DEST
done
exit 0
else
echo "===================$SLAVES================="
scp -r -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no $SRC $SLAVES:$DEST
fi
fi

#common
if [ $COMMAND == "common" ] || [ $COMMAND == "command" ];then
if [ -f $SLAVES ];then
cat $SLAVES | while read slave
do
#已#开头的注释可略过
echo "$slave" | grep -q "^#"
if [ $? -eq 0 ] ; then
continue;
fi

ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no $slave << EOF
echo "==================$slave======================"
eval $@
exit
EOF
done
exit 0
else
ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no $SLAVES << EOF
echo "==================$SLAVES======================"
eval $@
exit
EOF
fi
fi

脚本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 复制文件到所有机器的/home/hadoop/apache-hadoop/目录下,all_node是列表
./tools.sh copy all_node /home/hadoop/apache-hadoop/hadoop-2.8.0.tar.gz /home/hadoop/apache-hadoop/

# 复制文件到shining-1.hostname机器的指定目录下
./tools.sh copy shining-1.hostname /home/hadoop/mapred-site.xml /home/hadoop/apache-hadoop/hadoop/etc/hadoop/

# 复制多个文件到所有机器的指定目录下
./tools.sh copy all_node "core-site.xml hdfs-site.xml yarn-site.xml" /home/hadoop/apache-hadoop/hadoop/etc/hadoop/

# 到所有机器下执行命令
./tools.sh command all_node 'cd /home/hadoop/apache-hadoop/;ln -s hadoop-2.8.0 hadoop;'

# 到执行集群下执行命令
./tools.sh command shining-1.hostname "hostname"

# 执行追加命令
./tools.sh command all_node 'echo "export JAVA_HOME=/usr/java/jdk1.8.0_45" >> /etc/profile ; echo "export PATH=\$JAVA_HOME/bin:\$JAVA_HOME/jre/bin:\$PATH" >> /etc/profile'
说明
  • 第一个参数是告诉脚本,是执行 copy 还是 command 命令
  • 第二个参数是远程执行的主机列表, all_node 是一个文件,里面放主机列表,如果执行单台机器的,可以直接跟 shining-1.hostname 主机名。
  • 第三个参数就是需要执行的具体命令。

如果你感觉文章还可以的话,请帮点点下面的广告哦! 谢谢

感谢您的支持!