fish shell和ssh远程命令的问题

时间:2016-06-13 07:48:20

标签: linux bash shell ssh fish

我在桌面上使用鱼壳。

我们在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

有没有办法让鱼忽略这个?

2 个答案:

答案 0 :(得分:4)

你想要引用那个论点。

在双引号(")中,fish会尝试展开以$开头的所有内容,因此会看到$(,然后为其打印错误。但它也会在$1的参数中看到awk并展开它。

当你想要单引号转到被调用的命令时(就像这里,你希望awk的参数是单引号的,因为这将通过bash的扩展),你需要用{转义引号{1}}。

尝试

\

答案 1 :(得分:0)

感谢上面关于单/双引号的好建议和提示。不幸的是,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