什么是ssh及本文背景?
SSH 是建立在应用层基础上的安全协议,专为远程登录会话和其他网络服务提供的安全性协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。相较于传统的网络服务程序,如ftp、pop和telnet,因为它们在网络上用明文传送口令和数据,所以是不安全的,而ssh传输协议是加密的,可保证数据传输的安全性。
网络上有很多配置Linux主机间ssh的教程,缺少Windows主机间ssh配置的详细说明,而大多数人使用的是Windows电脑,本文会详细记录笔者如何在多台Windows电脑间配置ssh和使用ssh。(由于本文记录的是通过自行安装OpenSSH的方式,获取ssh服务,所以对windows版本无限制)
为什么需要ssh?
工作中可能遇到上图这样的场景:公司局域网内有一台公共的Windows电脑作为服务器,多人都想登录进去,利用其环境,执行某脚本或工具,获得输出。或者说存在跨主机执行命令,传输文件等需求,此时就需要配置ssh服务,在两台电脑间配置了ssh服务后,两台电脑就如同一台电脑一样,互信,资源共享。调用远程主机上的脚本,如同调用自己主机上的脚本一样方便。再比如那台服务器是台docker驻留主机,大家都有需求去登录这台电脑,制作docker镜像,使用docker容器,而自己电脑不想安装docker,如果用windows的远程桌面,只能一人在线,而ssh就可以使多人同时在线,而且ssh命令还可以写进批处理脚本,实现自动化跨主机执行命令,再扩展下,多台服务器,如果都配置了ssh,任何一台工作主机,相当于拥有了多台服务器的工作能力。总之:有了ssh,局域网内多台电脑的使用,就像一台电脑一样方便。
如何使用ssh?
Windows电脑上直到Windows10才推出了ssh服务,但如果两台Windows上的ssh服务版本不匹配,也运行不了,或者Windows 7电脑无法正确安装windows自带的ssh服务,而导致windows7电脑上用不了ssh服务。本文记录通过自行安装OpenSSH的方式,获取ssh服务,对windows版本无限制。
1. 下载OpenSSH安装包,分别在客户端主机和服务端主机上初步安装。
下载链接
然后选择合适的版本,笔者的为Win64版本。
解压到C:\Program Files\OpenSSH,建议是放在此目录下。
建议将C:\Program Files\OpenSSH添加到环境变量path中,免得每次都要切到C:\Program Files\OpenSS才能使用该ssh,如果有多个版本的ssh,建议将该路径移至path变量的前边,使之成为默认的ssh工具。
此时可以在命令行用where ssh和ssh -V,查看默认的ssh是否为刚才安装的版本。如果不是,则要重启电脑,让path变量重新生效。
备注:客户端和服务端主机都要安装上面的安装包。
先按照3. 配置服务端中前三步,在ssh服务端安装并启用sshd服务,然后进入下面的配置客户端。
2. 配置客户端
如果是客户端主机,安装完第一步后,接下来进入客户端配置环节。
以管理员身份运行cmd,切换到openSSH路径下
cd /d C:\Program Files\OpenSSH
1)初次链接服务端主机
输入服务端的用户名和ip地址
ssh serverusername@serveripdress
第一次连接,会收到如下所示的消息:
The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:.
Are you sure you want to continue connecting (yes/no)?
选输入yes后,该服务器主机会被添加到客户端主机上已知的SSH主机列表中。
系统此时会提示你输入密码。 密码为服务端主机的开机密码,作为安全预防措施,密码在键入的过程中不会显示。
连接后,你将看到如下Windows 命令行界面提示符,表示已进入到服务端主机。
domain\username@SERVERNAME C:\Users\username>
2)客户端主机生产密钥对
输入以下命令,用ssh-keygen生成密钥对
ssh-keygen -t rsa
命令行里一路回车,在C:\Users\username\\.ssh下生成密钥对文件,id_rsa和id_rsa.pub,分别为私钥和公钥文件。
3)客户端主机开启密钥代理
首先开启ssh代理器
此电脑右键管理->服务->OpenSSH Authentication Agent,启动类型选择自动,并且启动。后续客户端就可以委托ssh-agent代为免密登录,然后将密钥加入到ssh代理器中。
ssh-add C:\Users\username\\.ssh\id_rsa
此时服务端还要做一些设置。
3. 配置服务端
如果是服务端主机,安装完第一步后,接下来进入服务端配置环节。
以管理员身份运行PowerShell,切换到openSSH路径下
1)安装sshd服务
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
2)开放22号端口(如果你在windows关闭了防火墙并配置了入站规则可以不执行如下命令,多执行不影响)
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
3)配置开机自启sshd服务
此电脑右键管理->服务->OpenSSH SSH Server,启动类型选择自动,并且启动OpenSSH服务。
4)服务端收集客户端公钥,并设置免密登录。
将第2.步客户端主机生成的公钥C:\Users\username\\.ssh\id_rsa.pub追加到服务端C:\Users\username\\.ssh\authorized_keys文件尾部,如果没有该文件,就新建该文件。
修改服务端sshd配置,打开C:\ProgramData\ssh\sshd_config做如下修改
即,禁掉密码方式登录,改用密钥方式免密登陆。
5)重启服务端电脑,使sshd_config配置文件生效。
4. 在客户端电脑执行服务端电脑上命令(示例)
1)登录进ssh服务端
打开ssh客户端电脑的命令行cmd,执行如下命令:
ssh serverusername@serveripdress
即可免密登录进服务端的主机中,像在客户端内部执行自己的命令一样,此时可以运行服务端内的可执行文件,脚本,执行命令等。如果想在批处理脚本中执行远程服务器的命令,请看下面。
2)跨主机直接执行命令
打开ssh客户端电脑的命令行cmd,执行如下命令:
ssh serverusername@serveripdress "ssh服务端上要执行的命令"
命令可以是服务端上的某个脚本或者exe。
3)跨主机文件拷贝
打开ssh客户端电脑的命令行cmd,执行如下命令:
scp 客户端文件路径 serverusername@serveripdress:文件将要存放在服务端的路径
scp serverusername@serveripdress:文件将要存放在服务端的路径 客户端文件路径
上面表示将本地文件,通过ssh拷贝到远程服务器上,下面的表示将远程服务器上的文件,拷贝到本地。
**说明**:ssh客户端用ssh命令执行远程电脑(ssh服务端)上的exe软件,如果exe软件执行过程中有不同阶段的打印,只能在ssh执行exe结束后,在ssh客户端这边看到,即ssh每执行完一句命令才能看到打印回显,如果是本地执行一个exe,会实时显示其不同阶段的打印。但如果执行的是远程电脑上的批处理脚本,则打印是实时回显的。