【问题标题】:How to manage root actions in batch script triggered by an SSH如何管理由 SSH 触发的批处理脚本中的根操作
【发布时间】:2012-10-25 08:15:17
【问题描述】:

好的,这是一个棘手的问题:

首先,我有一个在 Unix 机器上运行的非常小的 C 应用程序。此应用程序获取两个参数并尝试在 Linux (Ubuntu) 机器中执行 .sh 文件,如下所示:

./myapp luke leia

好的,现在 C 代码或多或少地执行以下操作:

char temp[512];
sprintf(temp, "ssh user@server \"sh \\$HOME/save.sh %s %s\"", argv[1], argv[2]);
system((char *)temp);

如您所见,它打开了与我的 Linux 服务器的连接并在我的“用户”的主文件夹中执行批处理脚本。这是我直接在终端中尝试时的样子:

ssh user@server "sh \$HOME/save.sh luke leia"

在我的 Unix 端,我被要求输入 SSH 密码,它工作得很好。我从我的 Unix 机器中的 save.sh 文件中获得了所有回声,它运行良好,除非我需要 sudo 权限。所以我在我的服务器上尝试了这个:

  1. 在服务器中使用sudo visudo,在我输入%sudo ALL=(ALL) ALL 的行下方:

    %user ALL=(ALL) NOPASSWD: /home/user/save.sh

  2. 我的 save.sh 如下所示:

#! /bin/bash
sudo echo "[save action] args: ${1} , ${2}" >> /somewhere/save.log;
echo "${1} and ${2} are brother and sister.";
  1. 我的“某处”文件夹属于根目录,所以通常我的“用户”无法保存它。所以我改变了我的应用程序中的代码来处理这个命令:

ssh user@server "sudo sh \$HOME/save.sh luke leia"

现在我收到此错误:

sudo: no tty present and no askpass program specified

使用 sudo 触发此脚本且不提示输入 root 密码的最佳方法是什么?我尝试使用-t,但要求输入 root 密码。有什么想法吗?

【问题讨论】:

  • 作为旁注,请在您的 c 代码中使用 snprintf 而不是 sprintf - 您提供的 sn-p 是缓冲区溢出漏洞的经典示例,您将未净化的用户数据写入基于堆栈的缓冲区.
  • 我更改了我的代码,感谢您的注意!

标签: c linux unix ssh sh


【解决方案1】:

我想到的解决方案是在您的 C 程序中提供“服务器”机器的根密码作为附加参数 (argv[3]):

char temp[1024];
snprintf(temp, sizeof(temp), "ssh user@server \"echo %s | sudo -S -s \\$HOME/save.sh %s %s\"", argv[3], argv[1], argv[2]);
system((char *)temp);

-S for sudo 表示密码将通过标准输入提供,因此不需要用户交互。这是理论上的解决方案(我没有时间检查它 - 对不起)自己检查它并告诉它是否有效。

【讨论】:

    【解决方案2】:

    使用 sudo 触发此脚本且不提示输入 root 密码的最佳方法是什么?

    您应该重定向 stdin/stdout/stderr 流来执行此操作,以便您的程序可以与目标对话。 system() 无法做到这一点,这是一种“一劳永逸”的解决方案。

    但以 root 身份运行 C 程序将消除问题并简化任务。

    由于您的(客户端)程序需要凭据才能在给定点使用它们,这可能是一个解决方案。

    【讨论】:

      【解决方案3】:

      您可以(并且应该)使用key with an empty passphrase,并将公钥添加到远程root 帐户的authorized_keys

      【讨论】:

      • 出于安全原因,我已经禁用了 root ssh 访问权限。所以我必须对密码进行硬编码,或者找到一种方法来消除对密码的需要。 Tnx!
      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2011-06-15
      • 2020-09-14
      • 2011-09-04
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多