我在终端中输入:ssh user@ip
然后系统会提示输入密码。
有没有办法在 ssh 命令本身中指定密码?
答案1
使用sshpass
,以下两种形式之一:
sshpass -ffilename ssh user@ip # prefer this
sshpass -pPa5sw0rd ssh user@ip # avoid this
您的密码位于文件的第一行filename
,或者字面上是Pa5sw0rd
。注意:
-p
在手册中, 或之后没有空格-f
,但是至少sshpass
我的 Debian 10 中的 1.06 允许这样做;您的 Debian 10sshpass
可能会或可能不会允许这样做。- 如果您的密码包含您的 shell 将解释的字符(例如
$
,'
或;
),那么您应该在命令行中正确引用它(但不在文件中)。 - 避免
-p
。用于chmod 600 filename
将文件设为私有(root 仍然可以访问它尽管)。了解安全注意事项在里面手动的。
答案2
正确的做法是从密码验证切换到公钥/私钥对。这通常不需要重新配置,而且非常简单。
步骤 1:如果您没有密钥,请创建一个:ssh-keygen
将为您完成此操作
第 2 步:在远程主机上授权此密钥:ssh-copy-id user@ip
使用您的密码运行一次
第 3 步:从现在开始ssh user@ip
将不再询问您的密码
答案3
这是一个使用的解决方案克拉克旺/帕什。它适用于 macOS(在 13.4.1 上测试)以及 Linux、FreeBSD、OpenWRT 和其他一些系统。
下载并编译
目前尚不存在预编译的二进制文件,但只需几个命令即可安装它:
git clone https://github.com/clarkwang/passh && cd passh
cc -o passh passh.c
cp passh /usr/local/bin
使用
passh -c1 -C -t10 -T -p hunter2 ssh -t user@host 'echo $HOSTNAME'
选项说明
-c1
仅尝试一次密码登录-C
如果密码登录失败则退出-t10
表示 10 秒后超时-T
如果发生超时则退出-p
指定要输入的密码
其他选择
预计
这是一个回答使用expect
。我更喜欢 passh,因为它不需要 HEREDOC 或单独的脚本,并且可以在 OpenWRT 等并不总是附带 expect 的嵌入式平台上工作。
密码
sshpass
已从 Homebrew 中删除,并且有点安装复杂在 macOS 上。passh 的作者还记录了一些细节,解释了为什么它在passh/sshpass损坏.md。
答案4
虽然这可能是一种解决方法,但您可以通过将密码粘贴到剪贴板并在出现提示时粘贴来轻松完成快速登录的工作。在 Windows 上的批处理文件中,它看起来如下所示:
clip <your-password>
ssh <user>@<server>
当您运行脚本时,只需点击Ctrl + V
即可。