1

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

首先,我有一个在 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 密码。有什么想法吗?

4

3 回答 3

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

于 2012-11-05T14:45:43.190 回答
0

您可以(并且应该)使用带有空密码短语的密钥,并将公钥添加到远程root帐户的authorized_keys.

于 2012-11-05T16:08:23.550 回答
0

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

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

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

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

于 2012-11-05T13:43:32.200 回答