2016-06-13 6 views
1

필자의 데스크탑에서 fish shell을 사용합니다.fish 쉘 및 ssh 원격 명령 관련 문제

우리는 도커 내에서 nginx를 실행하는 많은 서버를 사용합니다. 나는 서버에 ssh하고 docker에 로그인 할 수 있도록 함수를 만들려고했다.

문제는 물고기가 $ 명령에 대해 불평하고 있지만 명령은 물고기를 실행중인 컴퓨터가 아닌 원격 서버 (실행중인 bash)에서 실행되는 명령입니다. 스크립트를 더 쉽게 볼 수 있도록 단순화했습니다.

$(...) is not supported. In fish, please use '(docker)'. 
~/.config/fish/config.fish (line 59): ssh -t [email protected] "sudo bash && docker exec -it $(docker ps | grep -i nginx | awk '{print $1}') bash" 
                          ^
from sourcing file ~/.config/fish/config.fish 
called during startup 

이를 무시하는 물고기를 얻을 수있는 방법이 있나요 :

config.fish는

function ssh-docker-nginx 
ssh -t [email protected] "sudo bash && docker exec -it $(docker ps | grep -i nginx | awk '{print $1}') bash" 
end 

물고기 오류를 니펫을?

답변

4

당신은 그 인수를 인용 부호로 묶을 것입니다. 큰 따옴표 (") 물고기가 $로 시작하는 모든 확장을 시도 할 것이다, 그래서 $( 다음 그것을 위해 오류를 인쇄하는 것을 볼 수 있습니다에서

. 그러나 awk에 대한 인수에 $1이 표시되고 확장됩니다.

작은 따옴표를 호출 된 명령으로 이동하려면 (여기서와 같이 bash의 확장을 통해 awk의 인수를 작은 따옴표로 묶으려는 경우) 따옴표를 이스케이프 처리해야합니다 \.

는 싱글/더블 따옴표에 대한 위의 훌륭한 조언과 팁을위한

ssh -t [email protected] 'sudo bash && docker exec -it $(docker ps | grep -i nginx | awk \'{print $1}\') bash' 
0

감사를 사용해보십시오. 유감스럽게도 awk에서 이스케이프 처리 된 따옴표는 ssh에 잘 전달되지 않았습니다.

function ssh-docker-nginx 
cat docker-bash.sh | ssh -t -t [email protected] 
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 
:

은 다양한 옵션 후, 나는 (강제 TTY를 필요로하는)이 방법으로 해결