gpt4 book ai didi

c - 如何管理由 SSH 触发的批处理脚本中的根操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:07 25 4
gpt4 key购买 nike

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

首先,我有一个在 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:不存在 tty 且未指定 askpass 程序

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

最佳答案

我想到的解决方案是在您的 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 意味着密码将通过标准输入提供,因此不需要用户交互。这是理论上的解决方案(我没有时间检查它 - 抱歉)请自行检查并告诉它是否有效。

关于c - 如何管理由 SSH 触发的批处理脚本中的根操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13233041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com