따옴표를 사용하여 여러 명령으로 원격 ssh 명령을 실행하는 방법?


0

나는 많은 조합을 시도했지만 그 중 누구도 일하지 못했고 이제는 내 생각이 다되었습니다.

따라서 저의 의도는 예정된 직장에서 시간을 얻고, 30 분 전에 다른 AT 직장을 만드는 것입니다. 그리고이 명령을 for 루프로 여러 컴퓨터에 실행하십시오.

나는 지금까지이 일을했지만, 이것은 목적지가 아닌 소스 리눅스에서 AT 작업을 만든다 :

ssh linuxserver atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }

그렇다면 for-loop가 인용문을 더 어렵게 만들 것이라고 확신하지만 이전 명령을 수행하기 전에 테스트 할 수 없습니다. 그런 다음 for-loop를 다음과 같이 사용합니다.

for loop in $(cat /tmp/names)
do 
ssh $loop atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; } 
done

어떤 아이디어?


1
이러한 준비는 원격 시스템의 스크립트를 사용하는 것이 가장 좋습니다.
Raúl Salinas-Monteagudo

답변:


0

에 대한 액세스 권한이있는 경우 bash 당신은 printf '%q\n' "$command" 유효한 명령을 얻기위한 패턴. 먼저 유효한 노동 조합 지부 다음과 같은 명령 :

atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }

지금 변수에 넣는다. 그래서 에코 될 때 당신은 똑같은 결과를 얻습니다. 가장 쉬운 방법은 가능한 한 작은 따옴표를 사용하고 필요한 경우 큰 따옴표를 사용하는 것입니다 ( 작은 따옴표를 감싸기) :

$ cat command.sh
atq | awk '{print ($3), $2}' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }
$ command='atq | awk '"'"'{print ($3), $2}'"'"' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; }'

이들이 동일하다는 것을 확인할 수 있습니다. diff:

$ diff command.sh <(echo "$command")
$ echo $?
0

이제 그것을 인쇄하십시오. ssh 명령:

printf '%q\n' "$command"
atq\ \|\ awk\ \'\{print\ \(\$3\)\,\ \$2\}\'\ \|\ \{\ read\ time\;\ date\ -d\ \"\$time\ -30\ min\"\ \"+%H:%M\ %F\"\ \;\ \}\ \|\ \{\ read\ time2\;\ echo\ \"yum\ upgrade\ -y\"\ \|\ at\ \"\$time2\"\ \;\ \}

못 생겼어.하지만 효과가있다.


0

당신의 명령만으로 atq 명령이 원격 시스템에서 실행되면 작은 따옴표로 묶인 긴 명령 행 하나만 전달해야합니다.

ssh linuxserver '  command1 'command2' command3  '

그러나 명령 줄에는 작은 따옴표가 있으므로 다음과 같이 이스케이프 처리 할 수 ​​있습니다.

ssh linuxserver $'  command1 \'command2\' command3  '

결과는 다음과 같습니다.

ssh linuxserver $' atq | awk \'{print ($3), $2}\' | { read time; date -d "$time -30 min" "+%H:%M %F" ; } | { read time2; echo "yum upgrade -y" | at "$time2" ; } '

고마워, 작동 해! :)하지만 작은 따옴표 앞의 $ 기호의 의미를 이해하지 못합니까?
Okkim

신경 쓰지 마라, 나는 그것을 발견했다. mywiki.wooledge.org/Quotes
Okkim

0

너무 영리 해 지려고하지 마라. ssh hostname command arg1 arg2 ... argN 통사론. 원격 호스트에 쉘 스크립트를 작성하고 모든 인용문을 사용하여 동료의 눈을 굽히지 않고 작업을 수행하도록하십시오. 나는

$ ssh linuxserver /usr/local/bin/my_atq.sh

예, 그렇게하는 것이 훨씬 쉽지만 스크립트를 모든 서버에 복사하고 싶지는 않습니다. 그것은 지금 작동하고 새로운 것을 배웠습니다.
Okkim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.