따옴표를 사용하여 여러 명령으로 원격 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.