执行下面的 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
可以正常执行,请问如何解决?
解决了,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"
单引号就不用给$转义了
@jakio6: 是的
sudo ssh ${node//[[:space:]]/} 'docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive'
第一个只执行了ssh命令, docker命令是在$()命令替换里头执行的, 写在命令行的docker当做参数传给ssh了, 在docker前面加上;
docker
前面加 ;
,docker 命令不会执行
@dudu:
sudo ssh -t ${node//[[:space:]]/} ; docker exec -t $(docker ps -f name=ucenter_api -q) curl localhost/alive
这样不行吗, bash
@jakio6: 不行
@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?
@jakio6: 你执行时 ssh 命令失败了
@dudu: 不知道你${node//[[:space:]]/}
得到的是什么, 我这也没这个变量
替换得到是空的, 所以失败了
@jakio6: 可以把 ${node//[[:space:]]/}
换成可以 ssh 登录的主机名
@dudu: 我搞错了, 你这个命令是在远程服务器执行吗, 那应该给引用一下 $()这个命令替换, 不然在本地就被shell展开了