Как работает двунаправленный оператор для (g) awk? - PullRequest
0 голосов
/ 27 мая 2019

Я смотрел на двунаправленного оператора в awk и пытался его понять.

https://www.gnu.org/software/gawk/manual/html_node/Two_002dway-I_002fO.html#Two_002dway-I_002fO

Итак, я попробовал это в файле .awk,

BEGIN {
cmd="tr [a-z] [A-Z]"
print "hi" |& cmd
close(cmd,"to")
cmd |& getline
close(cmd)
}

найдено здесь, https://books.google.se/books?id=NrZTDwAAQBAJ&pg=PA322&lpg=PA322&dq=bidirectional+pipeline+awk+example&source=bl&ots=awgGmpZBxm&sig=ACfU3U0jxy2GO2qaUb-gCOrP9CmrC3SsYA&hl=sv&sa=X&ved=2ahUKEwijw8i267viAhXq-ioKHRyWDwMQ6AEwC3oECAgQAQ#v=onepage&q=bidirectional%20pipeline%20awk%20example&f=false

Это выглядит довольно хорошо, поэтому я попытался изменить его,

BEGIN {
cmd="ssh some_server"
print "ls /some/file" |& cmd
close(cmd,"to")
cmd |& getline
print $0
close(cmd)
}

Это не очень хорошо, хотя.Мне удается войти и получить баннер.Затем я получаю сообщение,

Предупреждение: нет доступа к tty (Плохой дескриптор файла).

После завершения программы завершается.Однако команда "ls" не запущена.Кто-нибудь, кто знает, что я пропустил?

РЕДАКТИРОВАТЬ

Я также попытался

BEGIN {
cmd="ssh some_server"
print "ls /some/file" |& cmd
cmd |& getline
print $0
close(cmd)
}

, не закрывая поток в одном из направлений.Результат непредсказуем.Он либо зависает, либо выходит из строя одинаково.По крайней мере, он не работает.

Запуск "ssh server ls / some / file" работает нормально, поэтому я подозреваю, что это проблема с bk / tcsh, связанная с awk.

РЕДАКТИРОВАТЬ2

Есть много других предложений здесь, поэтому я думаю, что мне нужно обновить свои вопросы.Иногда кажется, что MVCE может вызвать больше проблем, которые ему помогают ...

В любом случае, идея состоит в том, чтобы запустить сеанс ssh, на который я могу продолжать посылать новые команды, пока я не закончу, а затем закрыть ssh.сессия.Таким образом, идея состояла в том, чтобы инициировать сеанс оболочки ssh, а затем передать ему команды и прочитать ответы с помощью этого оператора.

BEGIN {
cmd="ssh some_server"
print "ls /some/file" |& cmd
cmd |& getline
print $0
print "some other command" |& cmd
cmd |& getline
close(cmd)
}

Также есть другие варианты, которые можно рассмотреть, но ни один из которых не будет легким.

EDIT3

Думает, что я перезапущу это здесь.

Я хочу начать сеанс ssh с клиентом ssh, идущим сстандартный дистрибутив linux RHEL7.Затем я хочу оставить сеанс открытым, пока продолжаю посылать ему команды.Когда я закончу, мне нужно прекратить сеанс.Из bash это будет выглядеть примерно так:

ssh host
command1
command2
exit 

Требование заключается в том, что это делается с помощью сценариев чистого awk.Все другие варианты просто создадут больше проблем в будущем.Обратите внимание, что имя пользователя пропущено.В настоящее время это обрабатывается в нашей среде, и ssh 10.10.10.10 прекрасно работает.

BR Patrik

1 Ответ

0 голосов
/ 27 мая 2019
  1. Это не то, как вы выполняете удаленную команду с ssh, ssh some_server -t 'command' - это.
  2. Это не то, как вы читаете вывод совместного процесса с getline, while ( (cmd |& getline line) > 0 ) - это.

Попробуйте это, не требуется совместный процесс:

BEGIN {
    cmd = "ssh some_server \047ls /some/file\047"
    while ( (cmd | getline line) > 0 ) {
        print line
    }
    close(cmd)
}

Однако, если вы действительно хотите использовать совместные процессы, вам нужен ssh для создания какого-либо процесса на удаленной машине.что последующие команды могут быть переданы.Может порождать раковину?Когда в прошлом я вообще не использовал awk, но в оболочке я использовал

coproc ssh_conn { ssh -T ... some_tool_waiting_for_input }

для создания удаленного процесса и именованного канала к нему, а затем для записи в него:

printf '%s\0' 'command' >&"${ssh_conn[1]}"

и прочитать его вывод:

IFS= read -r -d '' resp <&"${ssh_conn[0]}".

Так что вам нужно выяснить, что ssh -T ... some_tool_waiting_for_input как отправная точка для этого из awk (что я считаю плохой идеей для управленияпроцессы - это то, для чего предназначены оболочки, а не то, для чего предназначен awk - манипулирование текстом).

В приведенном выше случае мои удаленные инструменты читают строки с нулевым окончанием, а не с символами конца строки, поэтому я могу отправлять несколькотекст строки к нему.Ваши требования могут отличаться.

В целях безопасности моей удаленной команде требуется локальная аутентификация для аутентификации, и она не будет разрешать соединения ни с чем, кроме моей локальной команды, вы можете рассмотреть это, а не создавать удаленную оболочку, котораятогда любой может подключиться к выполнению команд на вашем удаленном компьютере.

Кстати, попробуйте добавить -T к вашей команде ssh, чтобы избавиться от Warning: no access to tty (Bad file descriptor).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...