我正在编写一个小型的 unix 可执行文件,它可以手动更改我的 macbook 的系统时间。当然,这需要密码,因此我使用 system() 函数与终端交互并使用 echo 和 sudo 更改日期。
见下文:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// Retrieve password:
printf("Enter Sudo Password:\n");
char *pswrd;
pswrd = getpass("Password: ");
char strA[512];
// Instruction to manually change the date:
char *strA1 = "echo \"";
char *strA2 = "\" | sudo -S date 020821002014";
// Stitch fields into one string:
strcat(strA, strA1);
strcat(strA, pswrd);
strcat(strA, strA2);
// Run string in Terminal:
system(strA);
}
您可以创建一个 Unix 可执行文件来测试。
在终端行中,它相当于:Sudo date 020821002014
> 无论如何,我的问题是:
我不喜欢每次运行可执行文件时都必须输入密码。有谁建议输入一次管理员密码并让我的 MacBook 将来识别可执行文件,这样我只需单击可执行文件并轻松更改日期即可。
哦,我只选择了日期,因为它通常需要密码,但这当然可以推广到其他管理员指令。
我考虑过的事情:
- 使用 root 超级用户,但这似乎有点矫枉过正 - 必须有另一种方法
- 直接将密码写入 .c 代码,但这听起来很粗略,并且对于多个用户来说不容易扩展
答案1
另一种方法(不会留下密码,也不会将其暴露给各种进程列表和诊断工具)是NOPASSWD
在配置文件中设置一个条目sudo
,仅允许date
运行命令,可能是一个确切的date
命令:
fixmeyourusernamehere ALL=(root) NOPASSWD: /bin/date 020821002014
将其设置在文件底部/etc/sudoers
(不过最好使用 进行编辑sudo visudo
),那么用户fixmeyourusernamehere
应该能够运行“sudo date 020821002014 without a password, but not any other commands (unless the
sudo”配置允许他们使用其他命令)。