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