打算做一个 ssh 免密登陆的脚本,用到了 expect 命令,但总是无法处理密码出错情况。代码如下:
ssh_copy_id_auto() {
user=$1
pass=$2
host=$3
key=$(echo ~/.ssh/id_rsa.pub)
expect << EOF
set timeout 5;
spawn ssh-copy-id -i $key $user@$host;
expect {
*(yes/no)?* { send yes\r; exp_continue; }
*password:* { send $pass\r; exp_continue; }
"*try again*" { exit 1; } # 密码错误时应该直接退出,错误码 1
eof { exit 0; }
};
EOF
}
无法匹配到密码出错的情况,不会退出,继续提示输入密码。 不知道是哪里的问题?
debug了下,把匹配优先级调整一下就好了
ssh_copy_id_auto() {
user=$1
pass=$2
host=$3
key=$(echo ~/.ssh/id_rsa.pub)
expect << EOF
set timeout 5;
spawn ssh-copy-id -i $key $user@$host;
expect {
*(yes/no)?* { send yes\r; exp_continue; }
"*try again*" { exit 1; } # 密码错误时直接退出,错误码 1
*password:* { send $pass\r; exp_continue; }
eof { exit 0; }
};
EOF
}
1
omph OP 用 debug 解决了,expect -d
出错时的信息:\r\nPermission denied, please try again.\r\r\[email protected]'s password: 会先匹配到*password:* 怪不得有些例子里多用 -exact |
2
asilin 2019-05-06 12:29:49 +08:00
为什么要重复造轮子?直接使用 sshpass 命令就行。
|
3
dorothyREN 2019-05-06 13:02:51 +08:00
用密钥登录不好吗
|
4
justin2018 2019-05-06 13:58:43 +08:00 1
shuttle mac 用这个 还不错~
|
5
loriri 2019-05-06 15:08:46 +08:00
用密钥登录不好吗
|
6
hackyuan 2019-05-06 15:12:15 +08:00 via Android
秘钥 + config 连 ip、端口都不用记
|
7
omph OP @asilin centos 源里没有,要自己编译,换个使用环境就麻烦了
@dorothyREN @loriri 是用的密钥,但用之前不要先拷过去?这个脚本就是做这个的,还可以批量拷贝 @hackyuan 经常用别人的机器登陆服务器,😒 |
8
wunonglin 2019-05-06 16:30:20 +08:00 1
推荐 Termius,mac、pc、android、ios 多端同步,让您放假的时候也能随时随地维护服务器
|
9
liangzi 2019-05-07 07:33:04 +08:00
为嘛我试了一下不行呢
|
13
ps1aniuge 2019-05-07 22:11:17 +08:00 1
ssh-copy-id4.ps1
<# 脚本目的: 从 win、linux 中复制 [本机 ssh 公钥] ,到 [目的 linux 版 ssh 服务器] 。 前提条件: install-module winscp 用法: ssh-copy-id4.ps1 -目的 ip 1.2.3.4 建议保存编码为:bom 头 + utf8 #> Param ( $目的 ip = '192.168.1.2' ) #先运行 ssh-keygen 回车,产生 key 文件。https://github.com/PowerShell/Win32-OpenSSH/releases if (($PSEdition -eq 'Desktop') -or (test-path c:\)) { $key 文件 1 = "$env:USERPROFILE\.ssh\id_rsa.pub" $key 文件 2 = "$env:USERPROFILE\.ssh\authorized_keys" Copy-Item -LiteralPath $key 文件 1 -Destination $key 文件 2 } if (($PSEdition -eq 'Core') -or (test-path /tmp)) { $key 文件 1 = "/root/.ssh/id_rsa.pub" $key 文件 2 = "/root/.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 交流群,2019-02-21 $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 连接 |
15
liangzi 2019-05-08 06:20:02 +08:00
@ps1aniuge 你这个如果频繁切换登录服务器和频繁切换本地机器的话改起来很麻烦 还不如楼主这个
楼主只是放出了一部分代码 不过已经够了 写个read 读取一下用户输入 就能实现每次都自定义用户名密码主机名 密钥指定目录 |
16
ps1aniuge 2019-05-11 10:41:13 +08:00
如果频繁切换登录服务器-----------你说的对,经过考量我写死了密码。
但是我正考虑开发下一个版本,使用 csv 文件存储 root 密码,和服务器 ip。有人想要么? |
17
einverne 2020-01-14 17:26:58 +08:00
如果是自己的机器为何不 ssh-copy-id
|