ssh免密登录远程执行命令/脚本
执行一条命令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 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
更多推荐
已为社区贡献1条内容
所有评论(0)