【问题标题】:Perl, executing linux shell commands that are multi-line, require authentication?Perl,执行多行的linux shell命令,需要身份验证吗?
【发布时间】:2011-03-16 00:14:57
【问题描述】:

我一直在环顾四周,但无法弄清楚这一点。我想出了如何执行 shell 脚本的 perl 执行,例如:

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

但是,我想从 perl 执行 shell 脚本,它会在命令行上执行类似的操作:

su
$password
nautilus

所以它将成为 root,然后打开 nautilus 浏览器。当我通过单独执行每个命令来尝试此操作时,如下所示,它不起作用..我将不胜感激任何关于正确完成方法的建议这个..谢谢

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

【问题讨论】:

  • 而不是不易读的$cmd = 'command'; system $cmd,你可以直接使用system 'command'
  • 另外,你为什么不让用户以root身份运行你的脚本呢?然后检查脚本中的根性:if (id -u` == 0) { print "we are root" }`
  • @fengshaun:这是来自 Perl 脚本,所以:if ($> == 0)

标签: linux perl command-line shell


【解决方案1】:

查看Expect 模块。它会做你想做的事。 (它应该已经包含在最近几个 Perl 版本中)

【讨论】:

  • 这不是一个问题,如果可以避免,expect 是一个很好的解决方案。使用 sudo 更好,因为它不需要您以明文形式留下密码。 sudo 还会记录所有使用情况,而如果有人阅读了您以明文形式编写的 root 密码,则不会通知您。
【解决方案2】:

如果您想手动操作,这是一种方法。但是,正如 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/
#

【讨论】:

    【解决方案3】:

    在代码中硬编码密码是一个可怕的想法,尤其是你的 root 帐户的密码。一个更好、更安全的方法是使用sudo 命令,该命令很可能预装在几乎每个 Linux 发行版中。您甚至可以允许用户执行具有 root 权限的预定义命令,而无需询问密码 - 这仍然更加安全,因为可以读取您的脚本变体的攻击者可以访问 root 密码,因此可以做任何他想做的事情,而使用sudo 变体只允许他以root 身份执行预定义的命令。此外,一旦您想更改您的 root 密码,代码也不会中断。

    /etc/sudoers:

    myuser ALL=NOPASSWD: /usr/bin/nautilus

    在你的 perl 脚本中:

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

    【讨论】:

    • 如果您需要以root身份运行多个命令,最简单的解决方案是将要以root身份运行的命令放在脚本中。
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2022-01-10
    • 2019-12-17
    • 2019-07-20
    相关资源
    最近更新 更多