• 执行一条命令

    ssh 192.168.1.12 source /etc/profile
  • 执行多条命令(如果有空格,那么需要使用双引号)

    ssh 192.168.222.102 "source /etc/profile;/root/apps/test.sh"

执行脚本的坑

通过ssh执行命令,是没有环境变量的,例如远程启动zookeeper。我们知道,zookeeper是需要java环境的支持,但是我们通过ssh启动其他服务器上的zookeeper时,虽然显示启动成功,但是切换到zookeeper服务器查看进程时,却发现没有zookeeper的进程。为什么呢?
我们知道,在/etc/profile中配置JAVA_HOME后需要source /etc/profile后,java环境才生效,而linux重启后,即使不手动执行source /etc/profile,java环境也是有效的,这是因为linux在启动时,已经初始化了/etc/profile文件。
通过ssh远程执行脚本或命令时,如果执行的东西是需要环境支持的,那么我们必须要先初始化环境。例如:test.sh需要java的支持,并且/etc/profile中配置了java的路径

ssh 192.168.222.102 "source /etc/profile;/root/apps/test.sh"

免密登陆的zookeeper自启动脚本

#!/bin/bash

SERVERS="pc-server1 pc-server2 pc-server3"
PASSWORD=root

# 自动复制ssh密钥到相应的主机
auto_ssh_copy_id(){
    expect -c "set timeout -1;
    spawn ssh-copy-id $1;
    expect {
        *(yes/no)* {send -- yes\r;exp_continue;}
        *assword:* {send -- $2\r;exp_continue;}
        eof {exit 0;}
    }";
}

ssh_copy_id_to_all(){
    for SERVER in $SERVERS
        do
            auto_ssh_copy_id $SERVER $PASSWORD
        done
}

ssh_copy_id_to_all

zk(){
    for SERVER in $SERVERS
        do
            ssh root@$SERVER "source /etc/profile;zkServer.sh $1"
        done
}

case $1 in
    start)
        zk $1
        ;;
    stop)
        zk $1
        ;;
    status)
        zk $1
        ;;
    *)
        echo "Usgae:{start|stop|status}"
esac
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐