在本地服务器上,我有一个程序将密码存储在预定义的环境变量(SPECIAL_PASSWORD
)中。
在远程服务器上,我有一个程序可以读取并使用预定义环境变量 ( ) 中的密码SPECIAL_PASSWORD
。
我想在远程服务器上执行该程序并提供本地环境中已设置的密码。
我的尝试如下:
local_command # produces the SPECIAL_PASSWORD Env Var
ssh -l remote_user remote_server <<EOSSH
export SPECIAL_PASSWORD=${SPECIAL_PASSWORD} # Transfer Env Var
remote_command # consumes SPECIAL_PASSWORD Env Var
EOSSH
它似乎也按预期工作:
- Unix
ps
似乎不泄露密码 - 只有当前进程或其子进程才能访问密码。
但这样做真的安全吗……密码在任何时候都可读吗?有更好的选择吗?
我可能会更改sshd_config
( AcceptEnv
) 和ssh_config
( SendEnv
) 以允许传输环境变量的子集,而无需上述技巧。然而,系统受到严格控制,并且 sshd_config 需要管理员干预。就我而言,似乎不可能更改sshd_config
.
更新
我正在使用通过将数据传输到运行的远程 ssh 命令中提供的不同解决方案。请注意,此语法不再与 HERE 文档结合使用。
sendEnv() {
echo "var1=${var1}"
echo "var2=${var2}"
...
}
sendEnv | ssh -l remote_user remote_server "receiving_command".
就我而言,这receiving_command
是一个 java 程序,它从System.in
.
它就像一个魅力。
答案1
它可由remote_user
和读取root
。没有别的,除非remote_command
将其写入全局可读文件或类似的文件。
/proc
您可以检查文件系统中进程的环境/proc/$pid/environ
。您要么需要与euid
of是同一用户$pid
,要么需要是root
,因为该文件的权限似乎默认为-r-- --- ---
。
除了使用环境之外,您还可以通过stdin
管道传递密码 via ssh
。如果您通过管道进入 ssh,据我所知,只有 root 和目标程序(及其子程序)才能访问它(假设$(cat /proc/sys/kernel/yama/ptrace_scope) == 1
)。