如何让 SSH 从 stdin 读取密码,默认情况下它不会这样做?
基于这个post你可以做:
创建一个使用 SSH_ASKPASS 打开 ssh 会话的命令(在 man ssh 上寻找 SSH_ASKPASS)
$ cat > ssh_session <<EOF
export SSH_ASKPASS="/path/to/script_returning_pass"
setsid ssh "your_user"@"your_host"
EOF
注意: 为了避免 ssh 尝试在 tty 上询问,我们使用 setsid
创建一个返回密码的脚本(注意echo“echo)
$ echo "echo your_ssh_password" > /path/to/script_returning_pass
使它们可执行
$ chmod +x ssh_session
$ chmod +x /path/to/script_returning_pass
尝试一下
$ ./ssh_session
请记住,ssh 代表安全 shell,如果您将用户、主机和密码存储在纯文本文件中,您就会误导该工具并造成可能的安全漏洞
您可以使用 sshpass,例如在官方 debian 存储库 中。示例:
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
大多数 SSH 客户端都无法做到这一点。您可以使用 SSH API 来解决这个问题,例如 Python 的 Paramiko。小心不要推翻所有安全策略。
提炼这个答案留下一个简单而通用的脚本:
#!/bin/bash
[[ $1 =~ password: ]] && cat || SSH_ASKPASS="$0" DISPLAY=nothing:0 exec setsid "$@"
将其另存为
pass
,执行 chmod +x pass
,然后像这样使用它:
$ echo mypass | pass ssh user@host ...
如果它的第一个参数包含
password:
,那么它将其输入传递到输出(cat
),否则它将启动将自身设置为 SSH_ASKPASS
程序后所呈现的内容。
当
ssh
同时遇到SSH_ASKPASS
和DISPLAY
设置时,它将启动SSH_ASKPASS
所指的程序,并传递提示符user@host's password:
旧帖子复活了...
我在寻找完全相同问题的解决方案时发现了这个,我发现了一些东西,我希望有一天有人会发现它有用:
SSH_ASKPASS
变量 (export SSH_ASKPASS=/usr/bin/ssh-askpass
)setsid ssh user@host
)这看起来很简单,足够安全,但尚未检查(仅在本地安全上下文中使用)。
我们到了。
更好的
sshpass
替代方案是:
https://github.com/clarkwang/passh
我遇到了问题
sshpass
,如果 ssh 服务器没有添加到我的 known_hosts
sshpass
不会向我显示任何消息,passh
没有这个问题。
我不确定您需要此功能的原因,但似乎您可以使用 ssh-keygen 获得此行为。
它允许您通过计算机上的 RSA 私钥和服务器上的 RSA 公钥,无需使用密码即可登录服务器。
自动加载 ssh 密钥: 添加到.bashrc并配置环境变量。
export SSH_DIR="${HOME}/.ssh"
command mkdir -p "${SSH_DIR}"
eval "$(ssh-agent -s)" >/dev/null 2>&1
export SSH_AUTH_SOCK="${SSH_AUTH_SOCK}"
export SSH_AGENT_LIFE=14400 # 4 hours
export SSHADD_OPTS=""
export PASS_SSH_ENTRY_PREFIX="_ssh"
if command -v pass &>/dev/null \
&& command -v gpg &>/dev/null \
; then
for _public_key in "${SSH_DIR}"/*.pub ; do
_private_key="${_public_key%.pub}"
_entry="$(basename "${_private_key}")"
if command pass ls "${PASS_SSH_ENTRY_PREFIX}/${_entry}" &>/dev/null ; then
if ! command ssh-add -l | command grep -qF -- "$(command ssh-keygen -lf "${_public_key}")" &>/dev/null ; then
_ask="${SSH_DIR}/ssh-askpass.sh"
(\
echo '#!/usr/bin/env -S bash -euo pipefail' ; \
echo ; \
echo "command pass '${PASS_SSH_ENTRY_PREFIX}/${_entry}/password' | command head -n 1" \
) > "${_ask}"
command chmod u+x "${_ask}"
DISPLAY="${DISPLAY:-dummy}" \
SSH_ASKPASS_REQUIRE=force \
SSH_ASKPASS="${_ask}" \
command ssh-add -t "${SSH_AGENT_LIFE}" ${SSHADD_OPTS:-} "${_private_key}"
fi
fi
done
command rm -f "${_ask}"
unset _public_key _private_key _entry _ask
#echo ; ssh-add -l
fi
我的通行证 ssh 条目:
$ pass _ssh/
_ssh
└── id_termux
├── cipher
├── note
├── password
├── privateKey.priv
└── publicKey.pub
...