ssh@host:""ssh切换到其他机器上执行多条命令;Pseudo-terminal will not be allocated because stdin is not a terminal.

1.背景:shell脚本在主机器上执行kafka的启动命令,其他机器也会起这个进程。

之前的脚本每次执行的时候出现卡住的现象,不能回到命令行。

解决方法:

第一种

#/bin/bash
KAFKA_HOME=/opt/kafka
source /opt/wyl/cfg.config
su - hadoop <for mm in ${ip[*]};do
    echo "===>"\${mm}: 
    ssh hadoop@\${mm} "cd /opt/kafka ; nohup ./bin/kafka-server-start.sh ${KAFKA_HOME}/config/server.properties > /opt/kafka/kafka.log & [ $? -eq 0 ] && echo 'kafka is start...' "
done
EOF

其中ip就是所有需要执行的机器列表。
ssh hadoop@${mm}后续必须要跟双引号
其中分号是分隔命令的作用
/opt/kafka/kafka.log 是将日志打印到这个地方

第二种:

ssh root@ip << remotessh
首先要ssh上去,ssh的配置可以看我的上一篇文章,注意这里的<< remotessh
从这里开始都是在远程机器上执行命令啦
cd /tmp/test/
rm -f test.txt
cat test.log | grep ‘test’ >> test.txt
echo “finished!”

执行完毕

exit ###不要忘记退出远程机器
remotessh ###还有这里的结尾哦,不要忘记

 #!/bin/bash
  2 KAFKA_HOME=/opt/kafka
  3 source /opt/wyl/cfg.config
  4 su - hadoop <5 for mm in ${ip[*]};do
  6 echo "===>"\${mm}:
  7 ssh -Tq hadoop@\${mm} << remotessh   
  8 cd /opt/kafka                         #要顶格写,不然会报错的
  9 nohup ./bin/kafka-server-start.sh    ${KAFKA_HOME}/config/server.properties > /opt/kafka/kafka.log & #要顶格写,不然会报错的
 10 [ $? -eq 0 ] && echo 'kafka is start...'  #要顶格写,不然会报错的
 11 exit  
 12 remotessh
 13 done
 14 EOF

这种方法执行脚本之后,会打印出

Pseudo-terminal will not be allocated because stdin is not a terminal.

字面意思是伪终端将无法分配,因为标准输入不是终端。
强迫症的人肯定感觉很烦的。
这个时候我们可以加上参数去解决这个问题。
所以需要增加-tt参数来强制伪终端分配,即使标准输入不是终端。
或者加上-Tq这个参数也可以。

加上-tt运行结果: ssh -tt hadoop@’xxxx’
每个终端都打印出执行的命令
ssh@host:
加上-Tq的运行结果 ssh -Tq hadoop@’xxxx’
ssh@host:

你可能感兴趣的:(linux)