我为 SSH 连接配置了密钥对。它可以工作,但当然需要密码。
ssh [email protected]
所以现在我尝试使用我安装的 sshpass 登录。我尝试过使用-p
财产,但也尝试过使用-f
财产,但没有任何效果 - 它只是挂起。
verbose 在客户端提供这些信息
sshpass -v -p "pass" ssh [email protected]
SSHPASS searching for password prompt using match "assword"
SSHPASS read:
SSHPASS read: Enter passphrase for key '/home/user1/.ssh/id_rsa':
在服务器端我可以在日志中看到这些信息:
Accepted key RSA SHA256:V/V29pA2Ps5k/lBgz2R5XFP6vaaaOUN5hj0hca+j8TI found at __PROGRAMDATA__/ssh/administrators_authoriz
ed_keys:1
debug3: mm_answer_keyallowed: publickey authentication test: RSA key is allowed
debug3: mm_request_send: entering, type 23
debug3: send packet: type 60 [preauth]
debug2: userauth_pubkey: authenticated 0 pkalg rsa-sha2-256 [preauth]
debug3: user_specific_delay: user specific delay 0.000ms [preauth]
debug3: ensure_minimum_time_since: elapsed 19.018ms, delaying 1.849ms (requested 5.217ms) [preauth]
Postponed publickey for user1 from 10.7.141.243 port 44750 ssh2 [preauth]
非常感谢您的热情帮助!
答案1
ssh
使用终端 ( )(而不是其标准输入)提示并读取密码(或密码短语)/dev/tty
。这样您就可以通过管道传输/重定向数据ssh
,并且仍然能够在被要求时提供密码。但要不通过终端提供密码,需要向 提供一个“假”终端ssh
。这就是作用sshpass
。
当您在专用的模拟终端中运行sshpass … ssh …
时。这意味着不会直接从您的终端读取。并且不会直接打印到您的终端。最终将充当中继,因此就像使用您的终端一样。但在此之前,拦截打印内容;它还会注入您在之后指定的字符串,然后“看到”该字符串来自正在使用的终端(不是您的终端)。这个方法可以骗你sshpass
ssh
ssh
sshpass
ssh
sshpass
sshpass
ssh
sshpass
ssh
-p
ssh
ssh
ssh
打字的密码,当是sshpass
谁“输入”时。
默认情况下,sshpass
等待assword:
(或assword
1?)作为密码提示的一部分出现。例如,如果您没有使用密钥并且没有使用sshpass
,ssh
将打印:
[email protected]'s password:
它会等待您输入密码。如果您曾经sshpass
提供密码,那么sshpass
将拦截此消息并为您“输入”密码。通过等待正确的提示sshpass
知道何时ssh
需要密码,只有这样它才会传递您的密码。
在你的情况下,提示有所不同。ssh
没有要求输入密码,它使用不同的提示要求输入密码。来自的提示ssh
完全正确Enter passphrase for key '/home/user1/.ssh/id_rsa':
,没有任何匹配的内容assword:
,因此sshpass
一直等待从未出现的默认提示。
用于-P
覆盖默认值。
-P
设置密码提示。 Sshpass 在程序到 TTY 的输出中搜索此提示,作为何时发送密码的指示。默认情况下 sshpass 查找字符串 (与和assword:
匹配)。如果您的客户的提示不属于其中任何一个,您可以使用此选项覆盖默认值。Password:
password:
(来源:man 1 sshpass
)
在你的情况下,它可能是:
sshpass -P assphrase -p "pass" ssh [email protected]
现在,如果sshpass
拦截Enter passphrase …
来自ssh
,它将响应您在 后指定的任何内容-p
。接下来,它将作为您的终端和ssh
正在使用的终端之间的中继;它会变得透明。
一般来说,sshpass
可用于向通常使用终端(而不是 stdin+stdout+stderr)提示输入和读取密码的任何工具提供密码(一般为字符串)。-P
允许您根据工具使用的提示调整命令。
1手册说assword:
,但你的输出sshpass -v
说using match "assword"
。无论怎样,您都需要-P
正确地传递密码。