sshpass 是 Linux 上的一个免输入密码通过 ssh 登录的方案,可以通过在命令行中指定密码,无需交互的方式完成一些自动化的动作。但是在 Windows 系统中并没有直接提供相关的支持。本篇文章针对这个思路探讨一下其他实现方式。
Win 安装 sshpass
在 github 上已有大神做了相关实现,项目为 sshpass-win32,但是是 win32 版本的,下载后安装即可实现 sshpass 功能。
通过 vbscript 进行相关的实现
vbscript 提供了一些自动化功能可以帮助实现 sshpass 的功能,代码如下:
Dim WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
' 创建一个 cmd 命令终端
WshShell.Run "cmd.exe"
WScript.Sleep 800
' 输入 ssh root@192.168.1.1
WshShell.SendKeys "ssh root@192.168.1.1" & vbCr
' 休眠 800ms
WScript.Sleep 800
' 输入密码
WshShell.SendKeys "123456" & vbCr
将上面的代码保存为 sshpass.vbs
文件然后双击执行,即可实现 ssh 免密登录。优点是代码简单,缺点是由于 WshShell.SendKeys
是控制当前系统输入的,所以要求预先将输入法调整为英文,并且脚本运行过程中不能操作系统,否则执行就会报错。
还可以将上面的脚本优化下,这样就可以在命令行中执行了:
Dim WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
' 休眠 800ms
WScript.Sleep 800
' 输入 ssh root@192.168.1.1
WshShell.SendKeys "ssh " & WScript.Arguments.Item(0) & vbCr
' 休眠 800ms
WScript.Sleep 800
' 输入密码
WshShell.SendKeys WScript.Arguments.Item(1) & vbCr
上述代码保存为 sshpass.vbs ,然后打开终端,执行 wscript sshlogin.vbs root@172.20.255.38 123456
,然后稍等片刻,即可获得自动登录的界面。
通过 Putty 中的 plink 命令实现
Putty 中有个工具 plink ,可以实现免密登录以及执行命令
plink -l root -pw 123456 -P 22 -batch 172.20.251.1
# -l root 指定登录用户名
# -pw 123456 指定登录密码为 123456
# -P 22 指定登录端口为 22
# -batch 禁用交互提示(初次登录可能会导致报错)
使用 plink 在远程执行一个命令
# 在远程执行 ip addr 命令
plink -l root -pw 123456 -P 22 -batch 172.20.251.1 ip addr
# -l root 指定登录用户名
# -pw 123456 指定登录密码为 123456
# -P 22 指定登录端口为 22
# -batch 禁用交互提示(初次登录可能会导致报错)
使用 plink 在远程执行一个本地脚本
当前文件夹下有一个 script.sh 脚本,如果想要在远程执行该文件的话可以使用以下命令:
plink -l root -pw 123456 -P 22 -batch -m script.sh 172.20.251.1
# -sshlog log_file:将调试日志输出到指定的文件。
# -m file:指定一个文件,其中包含要在远程服务器上执行的命令。这允许批量执行命令。
使用 plink 向远程传输一个本地文件
plink -scp local_file username@hostname:remote_directory
# local_file 是本地系统上的文件路径。
# username 远程服务器上的用户名。
# hostname 是远程服务器的主机名或 IP 地址。
# remote_directory 是远程服务器上的目标目录,文件将上传到该目录中。
示例命令将本地系统上的 local_file 文件上传到远程服务器的 remote_directory 目录中。
请确保具有适当的权限和访问权限来执行文件传输操作。另外,如果远程服务器的 SSH 端口不是默认的 22 端口,可以使用 -P 参数指定正确的端口号。
注意,使用 Plink 进行文件传输时,有可能会收到有关文件权限、目录权限等方面的提示或警告。确保在远程服务器上具有适当的权限来执行所需的文件传输操作。
plink 通过代理访问
是的,Plink 支持代理设置,可以通过一些选项来配置代理服务器。下面是 Plink 中常用的代理设置选项:
-
-proxy[+|-] [proxy-type:]host[:port]
:指定代理服务器的类型、主机和端口号。proxy-type
可以是以下之一:http
、https
、socks4
、socks5
。使用+
号表示使用代理,使用-
号表示不使用代理。例如,-proxy socks5:proxy.example.com:1080
表示使用 SOCKS5 代理服务器proxy.example.com
的端口号1080
。 -
-proxyusername username
:指定连接代理服务器时的用户名。 -
-proxypassword password
:指定连接代理服务器时的密码。同样,不建议在命令行中明文指定密码。
这些选项允许在连接到远程服务器时通过代理服务器进行通信。可以根据的代理服务器类型和配置选择适当的选项,并提供相应的主机、端口、用户名和密码。
可以通过运行 plink --help
命令或参考 Plink 的官方文档以获取更详细的代理设置选项和说明。
参考资料
- Windows如何使用批处理命令进行SSH连接并自动输入密码
- windows下的sshpass替代品
- plink(1) - Linux man page
- Using Plink for interactive logins
- Putty 阿里云镜像站
- sshpass:一个很棒的免交互 SSH 登录工具