背景:
最近接到小需求,开发一个工具用于分发软件包到目标计算机,并支持安装和卸载目标计算机上的软件。软件运行在windows系统上,目标计算机有两台,一台是Linux debian系统,一台是windows系统。
解决方向
1、尽量少的安装第三方软件和环境设置;
2、软件执行和操作过程中不再需要人工操作(例如输入密码、确认执行)
解决思路
这里主要想到两种实现方式:
1、自己开发对端软件运行在目标计算机上,用于接收软件包和配置文件,并负责接收命令和反馈执行结果。
优点:接收命令和反馈结果方便、自己开发的软件部署方便
缺点:两台目标计算机的操作系统不同,代码要差异处理、软件包比较大,文件传输需要拆分和组合
2、尽量使用操作系统自带的软件实现文件传输和远程执行命令。
优点:开发工作量小,不用开发对端目标计算机上的软件
缺点:需要配置环境、获取执行结果不方便
解决方案
这里介绍解决方案二,通过操作系统自带的软件实现文件传输和执行命令,所以需要先配置环境:
一、执行远程命令
远程执行命令(在本地windows系统发送命令到远端的linux系统和windows系统),可以使用ssh命令:例如
ssh root@ip "cd /opt/test/; ls"
ps: ssh 目标计算机用户名@目标计算机IP地址 “需要执行的命令,命令间使用分号间隔。当然这里也可以是执行一个脚本。”
但我们的计算机默认只安装了ssh客户端,并没有安装ssh服务端。所以需要首先在目标计算机安装ssh服务。
1、在Linux系统(debian)直接命令安装:
sudo apt-get update
sudo apt-get install ssh
2、在Windows系统(win10以上版本)
Win10桌面->右键菜单->显示设置->左上角,主页->应用->可选功能,然后添加可选功能OpenSSH服务器,点击安装即可。
安装完成后,使用管理员身份开启一个cmd窗口,再执行如下命令启动ssh服务:
net start sshd
ssh服务安装完成后,可以通过在本地使用ssh客户端远程登录ssh服务器来验证是否安装和启动正常:
ssh 用户名@IP
ps: 执行时需要手工输入密码验证通过后方可登录。
二、远程传输文件
解决了远程执行命令问题,接着是远程传输文件到目标计算机。我们使用scp工具,它是windows和linux系统都自带的工具,无需再安装。但通过scp工具传输文件需要输入密码,这在我们的代码里是不好交互的。解决办法是配置两台计算机之间的信任关系。配置成功后,ssh和scp命令执行时就不再需要输入密码。
配置服务器间信任关系:
1、先在本地windows侧生成密钥文件。
打开cmd命令窗口,执行命令:
ssh-keygen
ps: 执行过程中一路回车键即可。
此时会在当前用户路径 C:\Users\用户名\ .ssh 生成两个文件:
id_rsa和id_rsa.pub
这里的id_ras.pub文件即为公钥文件,后面会用到。
2、目标计算机是linux debian11系统建立信任关系
登录到目标linux系统,执行如下命令:
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
修改/etc/ssh/sshd_config文件如下:
最后重启ssh服务:
systemctl restart sshd
或者 service sshd restart
此时正常的话,使用ssh登录debian服务器的普通用户就不用输入密码了。
重要: 此时创建的是windows系统用户和debian系统中普通用户的信任关系。但如果需要在debian系统安装软件,需要拥有root权限。所以,这里需要建立和Debian系统的root用户信任关系。这样执行安装命令时拥有root权限并且无需输入密码。
sudo cp -rf ~/.ssh /root //把当前用户下的.ssh文件夹拷贝到root用户根目录下
再次修改/etc/ssh/sshd_config文件如下:
#PermitRootLogin prohibit-password 改为 PermitRootLogin yes
#Port 22 改为 Port 22
最后重启ssh服务:
systemctl restart sshd
或者 service sshd restart
此时正常的话,使用ssh登录debian服务器的root用户就不用输入密码了。
3、目标计算机是Windows系统建立信任关系
a. 先把上面本地计算机生成的id_rsa.pub 文件拷贝到目标计算机的 C:\Users\“用户名”.ssh 目录 下,并修改文件名称为 authorized_keys ,如果有多台计算机需要和此计算机建立信任关系,则把多台计算机的公钥文件内存都拷贝到authorized_keys文件中即可。
b. 再修改 C:\ProgramData\ssh\sshd_config 配置文件(注意这里的ProgramData文件夹默认是是隐藏文件夹,可以取消隐藏或者通过搜索找到)。
修改内容为:
确保以下3条没有被注释,后边的yes或no要写对
PubkeyAuthentication yes #启用SSH密钥认证
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes #启用输入密码认证
确保以下2条有注释掉
#Match Group administrators
#AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
最后以管理员用户打开powershell软件,再重启ssh服务:
net stop sshd
net start sshd
Set-Service sshd -StartupType Automatic #设置开机自启动
测试:上面设置完windows和linux系统的信任关系后,可以使用ssh或者scp命令测试是否再需要输入密码。
附录:
windows10离线安装OpenSSH
https://blog.csdn.net/marwenx/article/details/106096790