Windows SSH配置及免密执行命令指南

Windows端SSH服务设置,OpenSSH配置

场景:首先解释一下为什么手动安装OpenSSH,因为是公司内网中的内网,无法访问微软商店。

SSH是什么

SSH原理及基本使用

下载OpenSSH-Win64.zip,是免安装的,建议解压到C:\Program Files,将C:\Program Files\OpenSSH64 添加至环境变量使得cmd或powerShell认识,做SSH服务启动及开机自启动设置,这部分具体步骤推荐参考, 但该博客配置免密登录写的不好不要看了。或MS官方powerShell配置方式

为OpenSSH指定默认powerShell, 参考MS官方

1
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

ssh_config相关奇葩问题

听闻还有遇到ssh_config/sshd_config配置文件问题的,我这次运气比较好,先是试着用FreeSSH失败后,转用OpenSSH但FreeSSH服务还在,彻底卸载干净后重启,还好没再出幺蛾子,ssh_config/sshd_config参数中文详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h1kxa97M-1588823877868)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771206504.png)]

出现如下提示是SSH server配置发生过改变,在客户端中ssh目录known_hosts中存储的sshServer信息不对,需要更新下,嗯直接删除该文件中对应server的信息即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTTjU0vu-1588823877870)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771420575.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XPxOwlut-1588823877872)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771490460.png)]

client第一次连接sshServer会出现下述提示,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXxV7Ox2-1588823877874)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588771121632.png)]

好了,至此ssh连接OK了。接下来做SSH免密登录,用来跨机器执行任务

SSH免密登录

注意: Windows做SSHserver, 配置client端SSH免密登录

免密的秘钥对详解

SSH连接,要求client端ssh下known_hosts存储server信息,在第一次ssh连接时生成;免密只需再将client端的id_rsa.pub 注册给server的authorized_keys

操作步骤

  • 先ssh user@host 手动登录OK下

  • client端 ssh-keygen -t rsa 生成秘钥对.ssh目录id_rsa.pub, id_rsa

  • 将client端的公钥id_rsa.pub内容append到Server端的authorized_keys,没有就新建个该文件 可用ssh-copy-id user@server

  • 用ssh-copy-id命令我没成功,直接拷贝pub到authorized_keys就OK了

WindowsServer远程SSH执行命令

dos之start讲解(及更多dos指令)

dos之taskkill指令

SSH免密登录并执行dos指令。只有taskCmd1会阻塞,一直刷屏,导致下面的sleep,taskKill指令无法执行。无法达到预期效果,这时怎么搞呢?

思路1:写成python脚本。ssh username@server python xx.py的方式,但python2.7遇到问题os.popen() , os.system() 并不会创建新shell进程来执行,也一样会阻塞。如果os库下有创建新shell去执行就好了。 查了下没有。反正windows下不会创建新shell去执行。这样python上只能使用thread模块,不想搞那么复杂。

update:os.system() 是创建新shell进程去执行cmd的,可行。具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# coding=utf-8

import os
import time
 
path1 = os.path.dirname(__file__)
print(path1)#获取当前运行脚本的绝对路径

print'Begin iperf'
iperfCmd = 'start /b iperf -c 8.8.8.8 -u -b 150M -t 999 -i 1'
os.system(iperfCmd)

killIperf = 'taskkill /F /im iperf.exe'
print 'sleep begin'
time.sleep(10)
print 'sleep end'
os.system(killIperf)
print 'killed iperf'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYyCwhFZ-1588823877875)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588818897236.png)]

思路2:继续使用batch脚本,但像Linux上的nohup & 那样让后台执行,不会阻塞下面命令执行。然后powerShell,cmd都没有,不支持。cmd下有一个start /b command 可以后台,但只cmd支持,powerShell并不支持,然后需要sleep N秒,这sleep指令又只有powerShell支持而cmd不支持。而dos命令也没有开启新窗口的指令。无奈啊无奈。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBzrLOhD-1588823877876)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588767680319.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jE8XJxpy-1588823877877)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588767719656.png)]

dos上powerShell与cmd支持的指令差别很大,这个真的很伤。

思路3:我tm要用的iperf这么强大的通用命令,心想或许有指定时长的参数。卧槽一看

iperf -c 8.8.8.8 -u -b 150M -t 40 -i 1

这tm -t 就是呀。哎一条指令可以搞定了。自动退出不香么

思路4: 安装了git 自然拥有强大的bash ,试试这能否达到预期,还真是可以的。nohup & , sleep, ps , grep , kill命令通通支持。当然win指定gitbash需要注册表修改下。直接在cmd,powerShell中无法直接切换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrmAdVm1-1588823877877)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588768578859.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCJALKuL-1588823877878)(C:\Users\w00448203\AppData\Roaming\Typora\typora-user-images\1588768734116.png)]

这里的小技巧:阻塞命令放后台执行,不断刷屏的,可以 > 输出重定向

至此踩了一天的坑,总算打通了Linux SSH访问Windows执行指令。学了不少脚本开发知识。

SSH远程执行命令/任务

基本方式:

1
2
3
4
5
6
7
8
ssh user@host  "cmd1; cmd2; cmd3"

ssh user@host < python iperf.py  # 执行远程服务器上的py脚本

ssh user@host < task.sh args  # 执行本地脚本,可带参数arg

ssh user@host < "/tmp/test.sh args"  # 执行远程服务器上的脚本并带参数
ssh [email protected] nohup python scriptname.py &  #nohup& 仅限Linux

更多参考

Linux一键清空文件内容

快速清空一个文件或者log的内容:

1
2
3
4
5
1、#echo "" > test.txt(文件大小被截为1字节)

2、# > test.txt(文件大小被截为0字节)

3、#cat/dev/null > test.txt(文件大小被截为0字节)

7943/article/details/81535825):

1
2
3
4
5
1、#echo "" > test.txt(文件大小被截为1字节)

2、# > test.txt(文件大小被截为0字节)

3、#cat/dev/null > test.txt(文件大小被截为0字节)