V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ps1aniuge
V2EX  ›  分享创造

分享我编写的 powershell 脚本: ssh-copy-id.ps1

  •  
  •   ps1aniuge · 2019-02-21 00:40:08 +08:00 · 3327 次点击
    这是一个创建于 2133 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问:通过 [字符串界面] 。如何从 win,通过 ssh,连接到 sshd ?
    答:
    在任意版本 win 中,通过 cmd.exe ,powershell.exe 中调用 ssh.exe ,连接 sshd。


    问:通过 [ powershell 对象界面] 。如何从 win,通过 ssh,连接到 sshd ?
    答:
    ssh 客户端,需要安装 powershell6.0,及以上。
    ssh 服务器端,需要改写 sshd_config,加上
    Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
    并重启 sshd。
    2019-02-20


    问:powershell 对象界面。比字符界面好处有哪些?
    答:
    1 服务器端 /客户端 传递对象变量。
    2 服务器端 /客户端 传递脚本代码,脚本文件。


    问:通过 powershell 对象界面。如何从 win,通过 ssh,连接到 sshd ? poweershell 代码是什么?
    答:
    $连接 1 = New-PSSession -HostName 1.1.1.1 -UserName root
    invoke-command -ScriptBlock { xx 命令 } -Session $连接 1
    #或 invoke-command -FilePath 客户机上的脚本_在服务器上运行.ps1 -Session $连接 1


    问:上面命令每次都需要输入密码么?
    答:
    对,powershell 团队永远不会开发保存密码的功能。因为那是低安全级别。


    问:如何实现 ssh 免密?
    答:
    1 使用无密码 ssh 秘钥对。ssh 秘钥比 ssh 密码长度长,更安全。还支持服务端,客户端双向认证。

    2 使用有密码 ssh 秘钥对+ssh-agent.exe 。
    注意:这里的 ssh 秘钥对,适合于 ssh.exe 连接 sshd,也适合于 new-pssession 连接 sshd。


    问:怎么生成 ssh 秘钥对?
    答:
    1 ssh-keygen.exe 回车,可以加参数。
    2 使用 puttygen.exe 。
    3 使用 xshell ---》工具 ---》新建 用户秘钥生成向导。
    等。


    问:用私钥,通过 powershell 对象界面。如何从 win,通过 ssh,连接到 sshd ? poweershell 代码是什么?
    答:
    $连接 1 = New-PSSession -HostName 1.1.1.1 -UserName root -KeyFilePath $env:USERPROFILE\.ssh\id_rsa
    invoke-command -ScriptBlock { xx 命令 } -Session $连接 1
    #或 invoke-command -FilePath 客户机上的脚本_在服务器上运行.ps1 -Session $连接 1


    问:ssh-copy-id.ps1 脚本的使用场合,作用是?
    答:
    把 ssh 秘钥的 [公钥] 从 win,复制到目标 ssh 服务器。ssh 服务器可以是 win,可以是 linux。
    注意:这里的 ssh 秘钥对,适合于 ssh.exe 连接 sshd,也适合于 new-pssession 连接 sshd。


    问:去哪里下载 win 版 ssh 服务器,客户端?
    答:
    https://github.com/PowerShell/Win32-OpenSSH/releases


    问:为什么说我编写的 ssh-copy-id.ps1 ,比 linux 的 ssh-copy-id 还好用?
    答:
    linux 的 ssh-copy-id,需要输入密码。不适合于批量操作。我编写的脚本,可以保存密码。


    问:运行 ssh-copy-id.ps1 有什么前提要求?
    答:
    1 至少 powershell 5.0。win7 请安装:
    https://docs.microsoft.com/zh-cn/powershell/wmf/5.1/install-configure
    https://github.com/PowerShell/PowerShell/releases
    win10 跳过此步骤。

    2 (可选)需要用管理员权限,开启 powershell.exe ,运行 install-module powershellget -foce

    3 (必选)需要用管理员权限,开启一个新的 powershell.exe ,运行 install-module winscp

    ```powershell
    #
    <#
    脚本目的:
    从 win 中复制 ssh 公钥,到目的 ssh 服务器。

    前提条件:
    install-module winscp

    用法:
    ssh-copy-id3.ps1 -目的 ip 1.2.3.4
    建议保存编码为:bom 头 + utf8
    #>

    Param
    (
    $目的 ip = '192.168.1.2'
    )

    #先运行 ssh-keygen 回车,产生 key 文件。https://github.com/PowerShell/Win32-OpenSSH/releases
    $key 文件 1 = "$env:USERPROFILE\.ssh\id_rsa.pub"
    $key 文件 2 = "$env:USERPROFILE\.ssh\authorized_keys"
    Copy-Item -LiteralPath $key 文件 1 -Destination $key 文件 2

    $用户名 = 'root'
    $用户密码明文 = '这里填入你的 ssh 密码明文。'
    $用户密码密文 = ConvertTo-SecureString $用户密码明文 -AsPlainText -Force
    $我的登陆凭据 = New-Object System.Management.Automation.PSCredential ($用户名,$用户密码密文)
    #QQ 群号=183173532,名称=powershell 交流群,2018-12-26
    $sftp 连接参数 = new-WinSCPSessionOption -Protocol Sftp -HostName $目的 ip -Credential $我的登陆凭据
    $指纹 = Get-WinSCPHostKeyFingerprint -SessionOption $sftp 连接参数
    $sftp 连接参数.SshHostKeyFingerprint = $指纹
    $sftp 连接 = new-WinSCPSession -SessionOption $sftp 连接参数

    if (Test-WinSCPPath -Path '/root/.ssh' -WinSCPSession $sftp 连接)
    {
    Remove-WinSCPItem -Path '/root/.ssh' -Confirm:$false -WinSCPSession $sftp 连接
    }

    $权限 700 = New-WinSCPTransferOption -FilePermissions (New-WinSCPItemPermission -Octal 700)
    New-WinSCPItem -Path '/root/.ssh' -ItemType Directory -TransferOptions $权限 700 -WinSCPSession $sftp 连接

    $权限 600 = New-WinSCPTransferOption -FilePermissions (New-WinSCPItemPermission -Octal 600)
    Send-WinSCPItem -LocalPath $key 文件 2 -RemotePath '/root/.ssh/' -TransferOptions $权限 600 -WinSCPSession $sftp 连接

    Remove-WinSCPSession -WinSCPSession $sftp 连接
    ```
    8 条回复    2019-07-04 22:25:29 +08:00
    Ultraman
        1
    Ultraman  
       2019-02-21 01:40:09 +08:00 via Android
    > linux 的 ssh-copy-id,需要输入密码。不适合于批量操作。我编写的脚本,可以保存密码。
    我认为你的脚本跟 ssh-copy-id 干的本来就是两件事
    你干的跟这位老哥干的才是同一个事 你们拿来对比才有意义
    https://segmentfault.com/a/1190000009832597
    CallMeReznov
        2
    CallMeReznov  
       2019-02-21 08:35:57 +08:00
    哇,竟然是 powershell 的。。需要点赞,真的少见
    DAPTX4869
        3
    DAPTX4869  
       2019-02-21 09:42:23 +08:00
    暂时用不到,mark 下收藏先
    oott123
        4
    oott123  
       2019-02-21 10:21:07 +08:00 via Android
    > 对,powershell 团队永远不会开发保存密码的功能。因为那是低安全级别。

    > linux 的 ssh-copy-id,需要输入密码。不适合于批量操作。我编写的脚本,可以保存密码。

    你知道不安全还自己开发明文密码的脚本吗?→_→
    ps1aniuge
        5
    ps1aniuge  
    OP
       2019-02-21 14:32:44 +08:00
    你的脚本跟 ssh-copy-id 干的本来就是两件事 ---我看是同一件事哦。

    你知道不安全还自己开发明文密码的脚本吗?---这个脚本只做了 ssh keyfile 免密自动化。
    你用 new-pssession + 密码 连接远程,还是得输入密码。
    你用 new-pssession + keyfile 连接远程,本身就是安全的。
    并没有降低,ssh 远程的安全级别。
    sinv
        6
    sinv  
       2019-02-21 23:02:36 +08:00 via iPhone
    ssh 秘钥比 ssh 密码更安全的原因不是密码更长,而是采用了数字签名技术,除去双向认证的安全因素以外,其“更安全”的根本所在是每次提交到服务器的“密码”都是不一样的,并且是一次性的。
    ps1aniuge
        7
    ps1aniuge  
    OP
       2019-02-22 11:26:27 +08:00
    你是想说,服务器产生随机数,然后用客户机的公钥加密,把密文发给客户端。
    客户端接收到密文后,用自己的私钥解密,并用服务器的公钥加密,成为密文后,返回给服务端么?
    designer
        8
    designer  
       2019-07-04 22:25:29 +08:00
    给楼主一个赞!我真的需要这个功能,但是配置好复杂的说,没有通用的配置 example
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:48 · PVG 09:48 · LAX 17:48 · JFK 20:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.