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

2019-02-21 00:40:08 +08:00
 ps1aniuge
问:通过 [字符串界面] 。如何从 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 连接
```
3206 次点击
所在节点    分享创造
8 条回复
Ultraman
2019-02-21 01:40:09 +08:00
> linux 的 ssh-copy-id,需要输入密码。不适合于批量操作。我编写的脚本,可以保存密码。
我认为你的脚本跟 ssh-copy-id 干的本来就是两件事
你干的跟这位老哥干的才是同一个事 你们拿来对比才有意义
https://segmentfault.com/a/1190000009832597
CallMeReznov
2019-02-21 08:35:57 +08:00
哇,竟然是 powershell 的。。需要点赞,真的少见
DAPTX4869
2019-02-21 09:42:23 +08:00
暂时用不到,mark 下收藏先
oott123
2019-02-21 10:21:07 +08:00
> 对,powershell 团队永远不会开发保存密码的功能。因为那是低安全级别。

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

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

你知道不安全还自己开发明文密码的脚本吗?---这个脚本只做了 ssh keyfile 免密自动化。
你用 new-pssession + 密码 连接远程,还是得输入密码。
你用 new-pssession + keyfile 连接远程,本身就是安全的。
并没有降低,ssh 远程的安全级别。
sinv
2019-02-21 23:02:36 +08:00
ssh 秘钥比 ssh 密码更安全的原因不是密码更长,而是采用了数字签名技术,除去双向认证的安全因素以外,其“更安全”的根本所在是每次提交到服务器的“密码”都是不一样的,并且是一次性的。
ps1aniuge
2019-02-22 11:26:27 +08:00
你是想说,服务器产生随机数,然后用客户机的公钥加密,把密文发给客户端。
客户端接收到密文后,用自己的私钥解密,并用服务器的公钥加密,成为密文后,返回给服务端么?
designer
2019-07-04 22:25:29 +08:00
给楼主一个赞!我真的需要这个功能,但是配置好复杂的说,没有通用的配置 example

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/537081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX