【发布时间】: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 权限。所以我在我的服务器上尝试了这个:
-
在服务器中使用
sudo visudo,在我输入%sudo ALL=(ALL) ALL的行下方:%user ALL=(ALL) NOPASSWD: /home/user/save.sh 我的 save.sh 如下所示:
#! /bin/bash sudo echo "[save action] args: ${1} , ${2}" >> /somewhere/save.log; echo "${1} and ${2} are brother and sister.";
- 我的“某处”文件夹属于根目录,所以通常我的“用户”无法保存它。所以我改变了我的应用程序中的代码来处理这个命令:
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 是缓冲区溢出漏洞的经典示例,您将未净化的用户数据写入基于堆栈的缓冲区.
-
我更改了我的代码,感谢您的注意!