繁体   English   中英

鱼壳和ssh远程命令的问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM