возврат в Perl для вывода на печать на терминале

#perl

#perl

Вопрос:

Я пытаюсь получить вывод команды в переменной и проверяю, соответствует ли она другой переменной.

    $login1=`ssh ****************** date`;
  

При вводе этой команды вручную будет ожидаться запрос » Пароль: » . Когда я запускаю его из скрипта, он выполняет эту команду и печатает это приглашение, ожидая ввода пользователя, но мне это не нужно. Мне просто нужно получить этот вывод и сравнить

      if($login1=~ /Password:/)
            {   
              print " yes";
            }
         else
              {
                print "No ";
               }
  

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

Комментарии:

1. Это ssh блокирует ввод данных пользователем. Чего именно вы хотите здесь добиться?

2. Он останавливается, потому Password: что это не полная строка с концом строки, поэтому он все еще ожидает конца строки.

3. Я просто хочу зафиксировать вывод этих команд. Я не хочу ничего туда отправлять. Но он печатается на моем экране. Я просто хочу получить его вывод и сравнить, является ли его пароль или что-то еще.

4. Да, ssh блокирует ввод данных пользователем, я просто хотел проверить, блокируется ли он или нет, вот и все.. Если он блокируется, я должен напечатать «да», иначе «Нет».

5. Net::SSH::Expect было бы лучшим способом сделать это, поскольку использование ssh делает оболочку интерактивной и запускает удаленный сеанс tty.

Ответ №1:

Возможно, вы захотите взглянуть на -f флаг для ssh :

  -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.
  

Если вы хотите избежать паролей, настройте пару открытых / закрытых ключей без парольной фразы (опасно, но гораздо менее опасно, чем вводить пароль в скрипт) и скопируйте открытый ключ на удаленный сайт. IIRC, это выглядит примерно так:

 localhost $ ssh-keygen -b 2048 -t ecdsa -N '' -f ./datekey
localhost $ scp ./datekey.pub remotehost:/tmp
localhost $ ssh remotehost
(login)
remotehost $ cat /tmp/datekey.pub >> ~/.ssh/authorized_keys
remotehost $ logout

localhost $ ssh -i ./datekey remotehost date
  

Убедитесь, что вы храните ./datekey где-то, где другой пользователь вообще не может получить к нему доступ — даже для чтения.


Если вы просто пытаетесь обнаружить, вам может просто потребоваться передать ему EOF, чтобы заставить его двигаться дальше:

 $login1=`ssh ****************** date < /dev/null`;
  

Комментарии:

1. Нет, пожалуйста, смотрите Мой комментарий выше. Я не должен ничего менять в этой команде.

2. я использовал /dev/null . Но он не продвигается, а печатает пароль на экране.

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

4. Вы также можете использовать ssh -o "BatchMode yes" вместо использования < /dev/null трюка, чтобы перевести его в неинтерактивный режим.