首页 新闻 会员 周边

shell 脚本:ssh -t 与 docker exec -t 问题

0
悬赏园豆:50 [已解决问题] 解决于 2019-10-06 15:51

执行下面的 shell 脚本

sudo ssh -t ${node//[[:space:]]/} docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive

会报错

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Error: No such container: curl

而 ssh

sudo ssh -t ${node//[[:space:]]/} 

然后

docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive

可以正常执行,请问如何解决?

dudu的主页 dudu | 高人七级 | 园豆:30994
提问于:2019-10-06 13:56
< >
分享
最佳答案
0

解决了,1)要将 ssh 执行的脚本放在双引号中;2)要对 $ 进行转义。

sudo ssh ${node//[[:space:]]/} "docker exec -t \$(docker ps -f name=ucenter_api -q) curl localhost/alive"

也可以使用 xargs

sudo ssh ${node//[[:space:]]/} "docker ps -f name=ucenter_api -q | xargs -I {} docker exec -t {} curl localhost/alive"
dudu | 高人七级 |园豆:30994 | 2019-10-06 15:27

单引号就不用给$转义了

jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 15:32

@jakio6: 是的

sudo ssh ${node//[[:space:]]/} 'docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive'
dudu | 园豆:30994 (高人七级) | 2019-10-06 15:37
其他回答(1)
1

第一个只执行了ssh命令, docker命令是在$()命令替换里头执行的, 写在命令行的docker当做参数传给ssh了, 在docker前面加上;

收获园豆:50
jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 14:08

docker 前面加 ; ,docker 命令不会执行

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2019-10-06 14:23

@dudu:

sudo ssh -t ${node//[[:space:]]/} ; docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive

这样不行吗, bash

支持(0) 反对(0) jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 14:28

@jakio6: 不行

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2019-10-06 14:36

@dudu: 不应该啊, 我这个都行, docker都执行了两次的

└─▪ sudo whoami ; whoami
root
jakio6
└─▪ sudo ssh -t ${node//[[:space:]]/} ; docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
支持(0) 反对(0) jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 14:42

@jakio6: 你执行时 ssh 命令失败了

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2019-10-06 14:47

@dudu: 不知道你${node//[[:space:]]/}得到的是什么, 我这也没这个变量

支持(0) 反对(0) jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 14:48

替换得到是空的, 所以失败了

支持(0) 反对(0) jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 14:50

@jakio6: 可以把 ${node//[[:space:]]/} 换成可以 ssh 登录的主机名

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2019-10-06 14:56

@dudu: 我搞错了, 你这个命令是在远程服务器执行吗, 那应该给引用一下 $()这个命令替换, 不然在本地就被shell展开了

支持(0) 反对(0) jakio6 | 园豆:1318 (小虾三级) | 2019-10-06 15:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册