![](/img/trans.png)
[英]Linux shell script programming fundamentals: making a command-line tool that executes a command to execute several
[英]Shell script password security of command-line parameters
如果我使用密码作为命令行参数,它在系统上使用ps
是公开的。
但是,如果我在 bash shell 脚本中,我会执行以下操作:
...
{ somecommand -p mypassword }
...
这还会出现在进程列表中吗? 或者这样安全吗?
命令行将始终可见(如果仅通过 /proc)。
所以唯一真正的解决方案是:不要。 您可以在标准输入或专用 fd 上提供它:
./my_secured_process some parameters 3<<< "b@dP2ssword"
使用类似(简单第一)的脚本
#!/bin/bash
cat 0<&3
(此示例只会将错误的密码转储到标准输出)
现在你需要关心的是:
被调用的程序可以通过简单地覆盖argv
来更改其命令行,如下所示:
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
int arglen = argv[argc-1]+strlen(argv[argc-1])+1 - argv[0];
memset(argv[0], arglen, 0);
strncpy(argv[0], "secret-program", arglen-1);
sleep(100);
}
测试:
$ ./a.out mySuperPassword &
$ ps -f
UID PID PPID C STIME TTY TIME CMD
me 20398 18872 0 11:26 pts/3 00:00:00 bash
me 20633 20398 0 11:34 pts/3 00:00:00 secret-program
me 20645 20398 0 11:34 pts/3 00:00:00 ps -f
$
UPD:我知道,它并不完全安全,可能会导致竞争条件,但是许多从命令行接受密码的程序都会这样做。
如何使用文件描述符方法:
env -i bash --norc # clean up environment
set +o history
read -s -p "Enter your password: " passwd
exec 3<<<"$passwd"
mycommand <&3 # cat /dev/stdin in mycommand
看:
避免显示在进程列表中的唯一方法是重新实现要在纯 Bash 函数中调用的程序的全部功能。 Function 调用不是单独的进程。 但是,通常这是不可行的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.