[英]Problems with fish shell and ssh remote commands
我在桌面上使用鱼壳。
我们使用许多在docker中运行nginx的服务器。 我尝试创建一个函数,以便可以SSH到服务器,然后登录到Docker。
问题是fish在命令中抱怨$,但是命令是要在远程服务器(运行bash)上执行的命令,而不是在我的运行fish的机器上执行的命令。 我简化了脚本,使其更易于查看。
config.fish代码段
function ssh-docker-nginx
ssh -t sysadmin@10.10.10.10 "sudo bash && docker exec -it $(docker ps | grep -i nginx | awk '{print $1}') bash"
end
鱼错误:
$(...) is not supported. In fish, please use '(docker)'.
~/.config/fish/config.fish (line 59): ssh -t sysadmin@10.10.10.10 "sudo bash && docker exec -it $(docker ps | grep -i nginx | awk '{print $1}') bash"
^
from sourcing file ~/.config/fish/config.fish
called during startup
有没有办法让鱼忽略这一点?
您需要单引号将该参数引起来。
在双引号( "
)中,fish将尝试扩展以$
开头的所有内容,因此它将看到$(
,然后为其打印错误。但是在awk
的参数中它还将看到$1
并将其扩展。
而且,当您希望单引号转到被调用的命令时(例如,在这里,您希望awk的参数被单引号引起,因为这将通过bash的扩展进行),您需要使用\\
来对引号进行转义。
尝试
ssh -t sysadmin@10.10.10.10 'sudo bash && docker exec -it $(docker ps | grep -i nginx | awk \'{print $1}\') bash'
感谢您提供有关单/双引号的出色建议和技巧。 不幸的是,awk中的转义引号不能很好地传递给ssh。
经过各种选择,我采用了这种方法(需要使用tty来解决):
function ssh-docker-nginx
cat docker-bash.sh | ssh -t -t sysadmin@10.10.10.10
end
# docker-bash.sh
#!/bin/bash
sudo chmod 777 /var/run/docker.sock
sudo docker exec -it $(docker ps | grep -i nginx | awk '{print $1}') bash
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.