windows@windows设备之间远程命令行控制方案@windows设备间使用OpenSSH

文章目录

    • abstract
      • 为什么考虑命令行连接
      • 讨论主题
    • powershell远程控制
    • 使用PowerShell远程管理
      • 前提条件:
      • 步骤:
        • 1. 启用WinRM服务
        • 2. 配置信任主机
        • 3. 测试连接
        • 4. 创建远程会话
        • 5. 运行远程命令
        • 6. 关闭会话
      • 例子
      • 小结
    • SSH方案
      • 基础连接
      • 免密自动登录
        • 修改配置文件
        • 在ssh server端创建支持免密登录的公钥文件
        • 重启服务
        • 尝试免密登录
      • 配置默认shell

abstract

  • 对于两台windows设备,统一网络下经常用远程桌面来控制(mstsc)
  • 而用命令行来控制也是可以的,虽然windows主打可视化操作而非命令行,但是命令行也可以执行很多基础操作
  • 命令行下,可以执行比如文件管理,资源下载,软件安装不在话下,也可以利用vscode等代码编辑器借助Remote-SSH远程编辑代码

为什么考虑命令行连接

  • 命令行连接的一个好处在于资源消耗小,连接快捷,体验一致性好

    • 另外,现在windows命令行中也可以做到以管理员方式运行命令行

    • windows 11 24h2开始开发者模式中支持sudo运行

    • 而windows10也可以安装一些命令行工具比如scoop,然后下载诸如gsudo等工具实现类似效果

    • PS> scoop search sudo
      Results from local buckets...Name    Version      Source Binaries
      ----    -------      ------ --------
      gsudo   2.4.4        main
      psutils 0.2023.06.28 main   sudo.ps1
      sudo    0.2020.01.26 main
      nsudo   8.2          extras
      

讨论主题

  • 假设局域网内我有两台windows设备,如何在设备A用命令行控制另一台设备B?
    • 也就是说,把设备B作为server,设备A作为Client

powershell远程控制

在局域网内,你可以通过多种方法在设备A上使用命令行控制设备B。下面介绍一种常见的方法,即使用PowerShell和Windows远程管理(WinRM)。

使用PowerShell远程管理

前提条件:

  1. 启用WinRM服务:WinRM服务需要在两台设备上启用。
  2. 配置信任主机:设备A需要信任设备B。
  3. 用户权限:确保你有足够的权限来执行远程命令。

步骤:

1. 启用WinRM服务

在设备A和设备B上,都需要启用WinRM服务。打开PowerShell并运行以下命令:

Enable-PSRemoting -Force
2. 配置信任主机

在设备A上,配置信任主机,使其可以与设备B进行通信。假设设备B的IP地址是$ip=192.168.1.198

$ip=192.168.1.198 #根据自己的情况修改

配置设备B为信任设备

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "$ip"

你可以用逗号分隔多个IP地址。如果你想信任所有主机,可以使用通配符*,但这可能会有安全风险:

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"
3. 测试连接

在设备A上,使用以下命令测试与设备B的连接:

Test-WsMan -ComputerName $ip

如果一切正常,你应该看到一个成功的响应。

例如

PS C:\repos\scripts> Test-WsMan -ComputerName $ipwsmid           : http://schemas.dmtf.org/wbem/wsman/identity/1/wsmanidentity.xsd
ProtocolVersion : http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd
ProductVendor   : Microsoft Corporation
ProductVersion  : OS: 0.0.0 SP: 0.0 Stack: 3.0
4. 创建远程会话

在设备A上,创建一个到设备B的远程会话:

$s = New-PSSession -ComputerName $ip -Credential (Get-Credential)

此命令会提示你输入设备B的用户名和密码。

5. 运行远程命令

现在,你可以在设备A上运行命令来控制设备B。例如,查看设备B上的进程:

Invoke-Command -Session $s -ScriptBlock { Get-Process }
6. 关闭会话

完成操作后,记得关闭远程会话:

Remove-PSSession -Session $s

例子

假设你想在设备A上获取设备B的主机名。你可以运行以下命令:

Invoke-Command -Session $s -ScriptBlock { hostname}
PS C:\Users\cxxu>  Invoke-Command -Session $s -ScriptBlock { hostname}
RedmiBookPC

而查看目录可能不会得到正确的结果

PS C:\repos\scripts> invoke-command -Session $s -ScriptBlock {ls C:\share}Directory: C:\shareMode                 LastWriteTime         Length Name              PSComputerName
----                 -------------         ------ ----              --------------192.168.1.198192.168.1.198192.168.1.198192.168.1.198

通过以上步骤,你就可以在设备A上通过命令行控制设备B了。如果在过程中遇到任何问题,请检查防火墙设置或用户权限。

小结

  • 这种方式不是很优雅,连贯性和便利性不足

SSH方案

windows上需要手动安装ssh server软件(拓展模块),并且配置防火墙和服务自启动等设置

Get started with OpenSSH for Windows | Microsoft Learn

此外,官方文档还介绍了更多连接以及可以自定义配置的方案

Key-based authentication in OpenSSH for Windows | Microsoft Learn

OpenSSH Server configuration for Windows | Microsoft Learn

中文文档:

适用于 Windows 的 OpenSSH 服务器配置 | Microsoft Learn

基础连接

  • 在server端安装必要的ssh服务软件

    • 管理员方式运行powershell执行以下内容:

      # Install the OpenSSH Server
      Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
      
    • 详情另见它文(防火墙配置等)

  • Client连接Server

    • 一般的连接命令行格式ssh user@server

    • 如果两个设备都开启了网络发现,那么可以用以下格式连接:``ssh user@serverName`

      • 对于小型网络通常不用关心域,完整格式其实是ssh domain\username@servername,而经常省略掉domain\这部分内容

      • PS C:\Users\cxxu> ssh cxxu@redmibookpc
        #如果是初次连接,会有一段安全询问,通常输入yes即可
        cxxu@redmibookpc's password:
        Microsoft Windows [版本 10.0.19045.4529]
        (c) Microsoft Corporation。保留所有权利。cxxu@REDMIBOOKPC C:\Users\cxxu>
        
    • 否则用ssh user@serverIp来连接

      • PS> ssh cxxu@192.168.1.198
        #如果是初次连接,会有一段安全询问,通常输入yes即可(这里演示第一次连接的询问)
        The authenticity of host '192.168.1.198 (192.168.1.198)' can't be established.
        ED25519 key fingerprint is SHA256:+iQOIn71iEoPaKOzM8PXC7vyqCY3QC8yGolnxdN2ncs.
        This host key is known by the following other names/addresses:C:\Users\cxxu/.ssh/known_hosts:13: redmibookpc
        Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
        Warning: Permanently added '192.168.1.198' (ED25519) to the list of known hosts.
        cxxu@192.168.1.198's password:
        Microsoft Windows [版本 10.0.19045.4529]
        (c) Microsoft Corporation。保留所有权利。cxxu@REDMIBOOKPC C:\Users\cxxu>

免密自动登录

  • 和linux server类似,但是windows 中需要修改的ssh服务器端的配置文件位置和linux不同(毕竟文件系统不同)
  • 一般在C:\ProgramData\ssh目录下面的sshd_config文件中
  • 这里给出简单的过程,完善的文档参考前面列出的参考文档链接
修改配置文件
  • 您可以尝试用type C:\ProgramData\ssh\sshd_config命令行来查看配置文件中的内容

  • 默认情况下的配置文件无法直接免密登录,您需要修改部分内容(其实默认文件中大多都是注释语句,有些需要我们解开注释,有些需要我们转为注释)

    • 参考:在Windows Server 之间配置SSH 免密登录 - LearningAlbum - 博客园 (cnblogs.com)
  • 这里直接给出我已经修改过的一个可以免密登录ssh的配置文件(sshd_config)

    # This is the sshd server system-wide configuration file.  See
    # sshd_config(5) for more information.# The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options override the
    # default value.#Port 22
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::#HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
    #HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
    #HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
    #HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key# Ciphers and keying
    #RekeyLimit default none# Logging
    #SyslogFacility AUTH
    #LogLevel INFO# Authentication:#LoginGraceTime 2m
    #PermitRootLogin prohibit-password
    #StrictModes yes
    #MaxAuthTries 6
    #MaxSessions 10PubkeyAuthentication yes# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
    # but this is overridden so installations will only check .ssh/authorized_keys
    AuthorizedKeysFile	.ssh/authorized_keys#AuthorizedPrincipalsFile none# For this to work you will also need host keys in %programData%/ssh/ssh_known_hosts
    #HostbasedAuthentication no
    # Change to yes if you don't trust ~/.ssh/known_hosts for
    # HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don't read the user's ~/.rhosts and ~/.shosts files
    #IgnoreRhosts yes# To disable tunneled clear text passwords, change to no here!
    #PasswordAuthentication yes
    #PermitEmptyPasswords no# GSSAPI options
    #GSSAPIAuthentication no#AllowAgentForwarding yes
    #AllowTcpForwarding yes
    #GatewayPorts no
    #PermitTTY yes
    #PrintMotd yes
    #PrintLastLog yes
    #TCPKeepAlive yes
    #UseLogin no
    #PermitUserEnvironment no
    #ClientAliveInterval 0
    #ClientAliveCountMax 3
    #UseDNS no
    #PidFile /var/run/sshd.pid
    #MaxStartups 10:30:100
    #PermitTunnel no
    #ChrootDirectory none
    #VersionAddendum none# no default banner path
    #Banner none# override default of no subsystems
    Subsystem	sftp	sftp-server.exe# Example of overriding settings on a per-user basis
    #Match User anoncvs
    #	AllowTcpForwarding no
    #	PermitTTY no
    #	ForceCommand cvs server# Match Group administrators
    #        AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

    其实总得就保留了三条配置,其余都是注释掉:(不同版本的openssh server可能有所不同)

    PubkeyAuthentication yes
    AuthorizedKeysFile	.ssh/authorized_keys
    Subsystem	sftp	sftp-server.exe
    
在ssh server端创建支持免密登录的公钥文件
  • 默认情况下,这个文件为~/.ssh/authorized_keys

  • 方式有多种,以下方案提供的命令行直接在ssh client的命令行中执行(powershell)

  • 首先确定Client端的公钥文件位置

    • $pubkey="$home\.ssh\id_*pub"
      
    • 其中id_*pub可能需要您补全(比如id_ed25519.pub),特别是您创建了多个不同的ssh key时,如果创建过一个,那么通常可以不修改直接执行

  • 可以从而ssh client端上传到server

    • # $server='redmibookpc' #局域网内启用网络发现的话可以直接用计算机名
      $server='192.168.1.198' #更通用的是使用server的ip地址
      scp $pubkey $user_name@${Server}:~/.ssh/authorized_keys 
      
  • 也可以复制公钥到剪切板,然后登录到server中创建相应文件

    • 查看公钥

      type $pubkey #该值同上述指定
      
    • 复制输出的内容,在Server端创建文件~/.ssh/authorized_keys,并插入复制的内容

重启服务
Restart-Service sshd
尝试免密登录
PS> ssh cxxu@redmibookpc
Microsoft Windows [版本 10.0.19045.4529]
(c) Microsoft Corporation。保留所有权利。

如果顺利的话,就可以登录到远程windows server (ssh),默认命令行shell是cmd

输入powershellpwsh可以切换shell

配置默认shell

  • 适用于 Windows 的 OpenSSH 服务器配置 | Microsoft Learn

  • windows ssh server默认的shell是cmd,这是一个过时的shell

  • 我们可以更改为powershell或其他shell

  • 首先查看openssh是否安装在默认路径:

    PS> $env:path -split ';'|sls sshC:\WINDOWS\System32\OpenSSH\
  • 然后需要修改注册表,并且可以通过一个一句就可以实现修改

  • 首先登录到windows ssh server,确保shell处于管理员模式

    • 然后选择以下一个语句进行执行

    • 修改为自带的powershell版本

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

      New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\powershell\7\pwsh.exe" -
      PropertyType String -Force
  • 示例:修改为powershell7

    PS> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\powershell\7\pwsh.exe" -
    PropertyType String -ForceDefaultShell : C:\Program Files\powershell\7\pwsh.exe
    PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
    PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
    PSChildName  : OpenSSH
    PSDrive      : HKLM
    PSProvider   : Microsoft.PowerShell.Core\Registry

    从ssh Client 建立ssh连接,可以看到,默认shell为powershell7

    PS> ssh cxxu@redmibookpc
    PowerShell 7.4.3
    PS C:\Users\cxxu> 
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自学网络安全】:安全策略与用户认证综合实验

实验拓扑图: 实验任务: 1、DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 2、生产区不允许访问互联网,办公区和游客区允许访问互联网 3、办公区设备10.0.2.10不允许访问Dmz区…

新闻资讯整合平台:一站式满足企业信息需求

摘要: 面对信息爆炸的时代,企业如何在海量数据中快速获取有价值资讯,成为提升竞争力的关键。本文将探讨如何通过一站式新闻资讯整合平台,实现企业信息需求的全面满足,提升决策效率,同时介绍实用工具推荐&a…

Redis数据类型和数据队列

一.Redis数据类型 参考资料:http://www.redis.cn/topics/data-types.html 相关命令参考: http://redisdoc.com/ Redis 是一种基于内存的开源数据结构存储系统,支持多种数据类型,每种数据类型都有自己特定的操作命令。 String(字…

Games101学习笔记 Lecture17 Materials and Appearances

Lecture17 Materials and Appearances 材质 BRDF一、Diffuse/Lambertian Material二、Glossy Material三、Ideal reflective/ refractive Material (BSDF)1.镜面反射2.镜面折射3.菲涅尔项 Fresnel 四、Microfacet BRDF 微表面五、Isotropic / Anisotropic Materials (BRDFs)An…

博客标题:C++中的继承:构建面向对象的基石

目录 ​编辑 引言 继承的基本形式 示例1:基本继承 继承的类型 示例2:不同类型的继承 多重继承 示例3:多重继承 继承与多态性 示例4:继承与多态 结论 结尾 引言 在面向对象编程(OOP)中&#xff…

【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】

一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox,和Vmware是一样的,只是box更轻量级 1)需要注意内存选择,4G 2、启动完成后,需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具,进…

新手教学系列——crontab 使用不当引发的服务器性能问题

起因及症状 最近,我们的一台服务器随着运行时间的增加,逐渐出现了压力过大的问题。具体表现为数据库连接数飙升至 4000+,Redis 频繁超时,系统报错文件打开数过多等。针对这些问题,我们逐一检查了数据库连接池、Redis 连接池以及系统的 ulimit 配置,但都未能找到问题的根…

第241题| 确定极限中参数问题 | 武忠祥老师每日一题

解题思路:确定极限中的参数的方法是求这个极限;求极限根据类型选方法。 形可以用到三种方法:洛必达,等价,泰勒。 先观察题目,将看成一个整体,同时,并令,整理之后如下: 这里也要想办…

mysql怎么调整缓冲区大小

MySQL中调整缓冲区大小是数据库性能优化的重要一环。缓冲区大小直接影响了数据库的读写性能和响应速度。以下是一些常见的MySQL缓冲区及其调整方法: 一、InnoDB缓冲池(InnoDB Buffer Pool) InnoDB缓冲池是InnoDB存储引擎用来缓存表数据和索…

代码随想录第7天 454 、 383 、15、18

代码随想录第7天 454. 四数相加 II 思路就是先统计nums1和num2各个元素之和出现的次数&#xff0c;然后遍历num3和nums4各个元素之和&#xff0c;看其相反数是否在map中&#xff0c;若在加上出现次数 class Solution { public: int fourSumCount(vector<int> &num…

nginx.conf配置文件

1、全局模块 worker_processes 1; 工作进程数&#xff0c;一般设置成服务器内核数的2倍&#xff08;一般不超过8个&#xff0c;超过8个反而会降低性能&#xff0c;一般是4个&#xff0c;1-2个也可以&#xff09; 处理进程的过程必然涉及配置文件和展示页面&#xff0c;也就是…

高斯过程的定义

高斯过程 1. 高斯过程的定义2. 协方差矩阵的构建3. 协方差矩阵的性质3.1. 计算挑战3.2. 解决方法 1. 高斯过程的定义 高斯过程可以看作是对函数的分布&#xff0c;它假定任何有限数量的函数值的集合服从一个多元高斯分布。给定输入数据点集合 { x 1 , x 2 , … , x n } \left…

2024.7.9作业

1、提示并输入一个字符串&#xff0c;统计该字符串中字母、数字、空格以及其他字符的个数 #include <stdio.h> #include <string.h> int main(int argc,const char *argv[]) { char arr[30]{0}; int zm0,kg0,sz0,qt0; printf("请输入字符串&…

OpenStack是一个开源的云计算平台

OpenStack是一个开源的云计算平台&#xff0c;由多个组件组成&#xff0c;这些组件协同工作&#xff0c;提供包括计算、网络、存储和身份服务在内的基础设施即服务(IaaS)。OpenStack最初由NASA和Rackspace合作开发&#xff0c;目的是创建一个开放源代码的云操作系统。 OpenSta…

智慧光伏一站式解决方案

光伏电站智慧化管理平台&#xff0c;将现代先进的数字信息技术、通信技术、互联网技术、云计算技术、大数据挖掘技术与光伏技术高度融合而形成。可以满足光伏企业对电站的高发电量、低初始投资、低运维成本等需求&#xff0c;从开发到运维的25年生命周期内&#xff0c;实现高收…

使用clion刷leetcode

如何优雅的使用clion刷leetcode 安装插件&#xff1a;LeetCode Editor) 插件配置&#xff1a; 这样我们每打开一个项目&#xff0c;就会创建类似的文件 我们的项目结构&#xff1a; 我们在题解文件中导入头文件myHeader.h并将新建的文件添加到cmakelists.txt文件&#xff0c;…

2024前端面试真题【JS篇】

DOM DOM&#xff1a;文本对象模型&#xff0c;是HTML和XML文档的编程接口。提供了对文档的结构化的表述&#xff0c;并定义可一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构、样式和内容。 DOM操作 创建节点&#xff1a;document.createElement()、do…

hnust 1965: 深度优先搜索

hnust 1965: 深度优先搜索 题目描述 输入一个图&#xff0c;用邻接矩阵存储&#xff08;实际上也可以选择邻接表&#xff09;&#xff0c;并实现DFSTraverse操作。 拷贝前面已经实现的代码&#xff0c;主函数必须如下&#xff0c;完成剩下的部分。 int main() { Graph g; Cre…

RTOS系统 -- 调试大法之FreeRTOS在M4上实现coredump功能

FreeRTOS内核崩溃&#xff08;coredump&#xff09;及异常打印技术 技术背景 在嵌入式系统中&#xff0c;FreeRTOS是一款广泛使用的实时操作系统。FreeRTOS本身并不包含默认的coredump机制&#xff0c;但我们可以通过自定义异常处理函数来实现异常打印和coredump功能。通过捕…

了解PPO算法(Proximal Policy Optimization)

Proximal Policy Optimization (PPO) 是一种强化学习算法&#xff0c;由 OpenAI 提出&#xff0c;旨在解决传统策略梯度方法中策略更新过大的问题。PPO 通过引入限制策略更新范围的机制&#xff0c;在保证收敛性的同时提高了算法的稳定性和效率。 PPO算法原理 PPO 算法的核心…