Perl, выполняющий многострочные команды оболочки linux, требует аутентификации? - PullRequest
3 голосов
/ 14 июля 2010

Я искал вокруг, но не могу понять это .. Я выяснил, как выполнить Perl-выполнение сценария оболочки, например:

#!/usr/bin/perl
$cmd = "nautilus";
system $cmd;

Однако я хочу выполнить сценарий оболочки из Perl, который будет делать что-то вроде этого в командной строке:

su
$password
nautilus

Таким образом, он станет пользователем root, а затем откроет браузер nautilus. Когда я попробовал это, просто выполнив каждую команду отдельно, как показано ниже, это не работает. это .. спасибо

$cmd = "su";
system $cmd;
$cmd = $password;
system $cmd;
$cmd = "nautilus";
system $cmd;

Ответы [ 3 ]

3 голосов
/ 14 июля 2010

Проверьте модуль Expect .Это будет делать то, что вы хотите.(Он должен быть включен уже в последние несколько версий Perl)

1 голос
/ 15 июля 2010

Ужасно вводить пароль в код, особенно пароль вашей учетной записи root.Гораздо лучше и безопаснее было бы использовать команду sudo, которая, скорее всего, предустановлена ​​практически во всех дистрибутивах Linux.Вы даже можете позволить пользователю выполнять предопределенную команду с правами суперпользователя, вообще не спрашивая пароль - что еще более безопасно, поскольку злоумышленник, который может прочитать ваш вариант сценария, имеет доступ к корневому паролю и, таким образом, может делать все, что он хочетпри использовании варианта sudo позволяет ему только выполнить предопределенную команду от имени root.Кроме того, код не нарушается, если вы хотите сменить пароль root.

In /etc/sudoers:

myuser ALL=NOPASSWD: /usr/bin/nautilus

В вашем скрипте perl:

system("sudo /usr/bin/nautilus");

0 голосов
/ 14 июля 2010

Если вы хотите сделать это вручную, это один из способов сделать это. Однако, как и в посте Cfreak, я также рекомендую Expect:

# cat foo.pl
  #!/usr/bin/perl
  if( open SHELL, "| /bin/bash" )
  {
    print SHELL <<'COMMANDS';
  echo hello
  pwd
  # do whatever
  COMMANDS
    close SHELL;
  }
  else
  {
    die "horrible error: $!";
  }
# ./foo.pl
  hello
  /mypath/whatever/
#
...