Я перепробовал много комбинаций, но ни одна из них не сработала, и теперь мои идеи закончились.

Поэтому я намерен получить время от запланированного рабочего места и сделать еще одно рабочее место за полчаса до этого. И запустите эту команду в цикле for для многих компьютеров.

Я зашел так далеко, но это делает AT-работу в исходном linux, а не в месте назначения:

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 усложняет цитирование, но я не могу проверить его, прежде чем заставить эту предыдущую команду работать. Я бы тогда использовал цикл for вот так:

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

Есть идеи?

3 ответа3

0

Не пытайтесь быть слишком умным с помощью команды ssh hostname command arg1 arg2 ... argN синтаксис. Создайте сценарий оболочки на удаленном хосте и позвольте ему делать свою работу, а не сжигайте глаза коллег со всеми цитатами. То есть:

$ ssh linuxserver /usr/local/bin/my_atq.sh
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" ; } '
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\"\ \;\ \}

Ужасно, но это работает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .