如何将变量值发送到管道,同时将其从进程列表中隐藏?

如何将变量值发送到管道,同时将其从进程列表中隐藏?

我正在编写一个简单的 shell 脚本,该脚本读取 PIN 一次(到变量中)并使用它来调用需要此 PIN 的多个命令。可以指示这些命令从标准输入读取 PIN,但我不知道如何将变量值发送到管道而不在进程列表中显示它。通常的方式 - 使用echo "$PIN"- 将执行替换,以便其他用户可以通过进程列表看到 PIN 的值。

是否有一个命令接受变量名称并将该变量的值输出到标准输出?或者还有其他办法吗?

答案1

正如echo所有 shell 中内置的那样,它不会显示在进程列表中。

然而对于任意数据来说它是不可靠的

您可以使用printf '%s\n' "$PIN"更可靠的东西,但请注意,一些基于 pdksh 的 shell 仍然没有printf 内置。解决这些问题的方法是使用print -r -- "$PIN".在和 的所有实现print中可用,但不是标准命令。zshksh

您还可以使用此处文档:

cmd << EOF
$PIN
EOF

(或者现在在此处使用字符串 ( cmd <<< "$PIN")zsh和其他一些 shell)。但请注意,在大多数实现中,此处文档都是使用临时文件实现的,因此如果文件已提交到磁盘,则 PIN 可以脱机恢复。

如果可以避免的话最好不要导出PIN到环境,因为它更容易被其他进程发现(可以看出具有/proc/pid/environ相同 uid 的进程可以读取,而对于哪些进程可以读取另一个进程的内存通常有更多限制) 。ps在某些(罕见)系统上还可以让您查看任何进程的环境。

不过,一旦进入环境,在某些系统上,有一个printenv命令可以显示其值:

printenv PIN

或者你可以随时使用perl

perl -le 'print $ENV{PIN}'

相关内容