簡體   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