如何让ssh从stdin接收密码

问题描述 投票:0回答:9

如何让 SSH 从 stdin 读取密码,默认情况下它不会这样做?

ssh passwords stdin
9个回答
28
投票

基于这个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,如果您将用户、主机和密码存储在纯文本文件中,您就会误导该工具并造成可能的安全漏洞


17
投票

您可以使用 sshpass,例如在官方 debian 存储库 中。示例:

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

10
投票

大多数 SSH 客户端都无法做到这一点。您可以使用 SSH API 来解决这个问题,例如 Python 的 Paramiko。小心不要推翻所有安全策略。


6
投票

提炼这个答案留下一个简单而通用的脚本:

#!/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:


5
投票

旧帖子复活了...

我在寻找完全相同问题的解决方案时发现了这个,我发现了一些东西,我希望有一天有人会发现它有用:

  1. 安装 ssh-askpass 程序(apt-get、yum ...)
  2. 设置
    SSH_ASKPASS
    变量 (
    export SSH_ASKPASS=/usr/bin/ssh-askpass
    )
  3. 从终端打开一个新的 ssh 连接,没有未定义的 TERMINAL 变量 (
    setsid ssh user@host
    )

这看起来很简单,足够安全,但尚未检查(仅在本地安全上下文中使用)。

我们到了。


4
投票

FreeBSD 邮件列表 推荐 expect 库。

如果您需要编程式 ssh 登录,那么您确实应该 使用公钥登录 ,但是,与使用外部库通过

stdin
传递密码相比,显然这种方式的安全漏洞要少得多。


4
投票

更好的

sshpass
替代方案是: https://github.com/clarkwang/passh

我遇到了问题

sshpass
,如果 ssh 服务器没有添加到我的
known_hosts
sshpass
不会向我显示任何消息,
passh
没有这个问题。


2
投票

我不确定您需要此功能的原因,但似乎您可以使用 ssh-keygen 获得此行为。

它允许您通过计算机上的 RSA 私钥和服务器上的 RSA 公钥,无需使用密码即可登录服务器。

http://www.linuxproblem.org/art_9.html


0
投票

自动加载 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
...
© www.soinside.com 2019 - 2024. All rights reserved.