大概意思是本地服务器 A 发送命令到指定服务器 B,使服务器 B 启动 nginx 容器,并且将服务器 B 的 /etc/hosts 记录添加到 nginx 容器中。远程执行命令如下:
$ ssh root@host "docker run -d --name nginx-test $(cat /etc/hosts | grep '^192'| awk '{print "--add-host " $2":"$1}' | awk '{if(NR%900==0){printf $0 "\n"}else{printf "%s ",$0}}')  -p 80:80 nginx"
执行命令后没有按照预想的将服务器 B 的 hosts 记录添加到 nginx 容器中,而是把服务器 A 的 hosts 记录添加了进去。这种情况有无办法处理?谢谢。
最终通过 heredoc 的特性解决了问题,谢谢几位大佬,受益匪浅。
$ ssh root@host $(
cat << EOF
docker run -d --name nginx-test $(cat /etc/hosts | grep '^192'| awk '{print "--add-host " $2":"$1}' | awk '{if(NR%900==0){printf $0 "\\n"}else{printf "%s ",$0}}') -p 80:80 nginx
EOF
)
|  |      1wlsnx      2020-10-30 18:08:12 +08:00  1 最外面的双引号换成单引号试试,如果不行就把命令写到脚本里上传到目标机器再执行 | 
|  |      2rizon      2020-10-30 18:10:53 +08:00 双引号的 $()会被执行的的。你换单引号 或者转义一下试试 "\$()" | 
|      3Jirajine      2020-10-30 18:14:03 +08:00 via Android 把 $ 转义 | 
|  |      5codehz      2020-10-30 18:22:27 +08:00 via Android (对面开一个 bash -然后本地用文件 pipe 过去 | 
|  |      6bluehtt OP | 
|  |      8nuk      2020-10-30 18:31:09 +08:00 老哥先 echo 一下呀,echo 的结果就是远程执行的命令,当然这个双引号显然也是有问题的。 | 
|  |      9codehz      2020-10-30 18:34:49 +08:00 via Android  1 @bluehtt 这个就是非常通用的解决方法,适用于任何场景。。。唯一的问题就是多一个文件,但是总比思考转义方便 把命令按文本写在一个文件里(这里假设名字是 command ),不需要额外的转义,可以有换行。 然后再执行 <command ssh user@host "bash -s" (<pipe 放哪里都一样,只要和命令本体隔开至少一个空格 | 
|  |      10pagxir      2020-10-30 18:35:15 +08:00 via Android  1 CMD=$( cat << 'EOF' docker run -d --name nginx-test $(cat /etc/hosts | grep '^192'| awk '{print "--add-host " $2":"$1}' | awk '{if(NR%900==0){printf $0 "\n"}else{printf "%s ",$0}}') -p 80:80 nginx EOF ) ssh [email protected] $CMD | 
|  |      11pagxir      2020-10-30 18:37:35 +08:00 via Android  3 CMD=$(  cat << 'EOF' docker run -d --name nginx-test $(cat /etc/hosts | grep '^192'| awk '{print "--add-host " $2":"$1}' | awk '{if(NR%900==0){printf $0 "\n"}else{printf "%s ",$0}}') -p 80:80 nginx EOF ) ssh user@host $CMD | 
|  |      12atx      2020-10-30 18:38:48 +08:00  2 /etc/hosts 这种一般硬射进去好一点吧,方便修改 | 
|  |      16codehz      2020-10-30 19:04:02 +08:00 via Android @bluehtt 是一个变量,这是利用 heredoc 特性做的,这么说也不用变量了,结合一下直接 ssh user@host 'bash -s' <<'这段文字表示分割线,只要不和内容冲突就好' 任何命令 这段文字表示分割线,只要不和内容冲突就好 之前没提这个主要是没想起来 heredoc 也可以禁用内部转义的 | 
|  |      18bluehtt OP |