需求:ssh到远程主机后执行命令,命令里面包含变量以及变量的赋值
问题:
[root@k8s-master shell]# cat ssh.sh
#!/bin/bash
ssh -t -t root@192.168.200.142 <<eof
cd /
LSRESULT="$(ls)"
echo \$(ls)
exit
eof
[root@k8s-master shell]# sh ssh.sh
cd /
LSRESULT="auto_mutual_trust
ssh.sh"
echo $(ls)
exit
Last login: Thu Sep 21 10:56:56 2023 from k8s-master
[root@k8s-node1 ~]# cd /
[root@k8s-node1 /]# LSRESULT="auto_mutual_trust
> ssh.sh"
[root@k8s-node1 /]# echo $(ls)
[root@k8s-node1 /]# exit
logout
Connection to 192.168.200.142 closed.
可以看到echo $(ls) 返回是空
这是因为我们把赋值语句放在了输入重定向里面(<<eof..eof),这种情况下,脚本中的赋值语句将在本地的shell执行,而不是在远程机器B上执行,ssh远程过去后再直接返回A机器上执行的。
解决方法:在变量声明加入\转义
[root@k8s-master shell]# cat ssh.sh
#!/bin/bash
ssh -t -t root@192.168.200.142 <<eof
cd /
LSRESULT="\$(ls)"
echo \$(ls)
exit
eof
直接运行即可
[root@k8s-master shell]# sh ssh.sh
cd /
LSRESULT="$(ls)"
echo $(ls)
exit
Last login: Thu Sep 21 11:04:23 2023 from k8s-master
[root@k8s-node1 ~]# cd /
[root@k8s-node1 /]# LSRESULT="$(ls)"
[root@k8s-node1 /]# echo $(ls)
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var wyx
[root@k8s-node1 /]# exit
logout
Connection to 192.168.200.142 closed.
注意对比LSRESULT运行结果