ssh 自动登陆脚本的问题

2019-05-06 11:34:33 +08:00
 omph

打算做一个 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
}

无法匹配到密码出错的情况,不会退出,继续提示输入密码。 不知道是哪里的问题?

5263 次点击
所在节点    Linux
18 条回复
omph
2019-05-06 12:18:32 +08:00
用 debug 解决了,expect -d
出错时的信息:\r\nPermission denied, please try again.\r\r\nroot@192.168.56.100's password:
会先匹配到*password:*
怪不得有些例子里多用 -exact
asilin
2019-05-06 12:29:49 +08:00
为什么要重复造轮子?直接使用 sshpass 命令就行。
dorothyREN
2019-05-06 13:02:51 +08:00
用密钥登录不好吗
justin2018
2019-05-06 13:58:43 +08:00
shuttle mac 用这个 还不错~
loriri
2019-05-06 15:08:46 +08:00
用密钥登录不好吗
hackyuan
2019-05-06 15:12:15 +08:00
秘钥 + config 连 ip、端口都不用记
omph
2019-05-06 16:21:14 +08:00
@asilin centos 源里没有,要自己编译,换个使用环境就麻烦了

@dorothyREN
@loriri 是用的密钥,但用之前不要先拷过去?这个脚本就是做这个的,还可以批量拷贝

@hackyuan 经常用别人的机器登陆服务器,😒
wunonglin
2019-05-06 16:30:20 +08:00
推荐 Termius,mac、pc、android、ios 多端同步,让您放假的时候也能随时随地维护服务器
liangzi
2019-05-07 07:33:04 +08:00
为嘛我试了一下不行呢
omph
2019-05-07 10:12:54 +08:00
@liangzi 我用着可以了
有出错信息吗?
liangzi
2019-05-07 10:27:31 +08:00
@omph 弄好了 没事了 谢谢
Firxiao
2019-05-07 17:26:07 +08:00
@omph
```
yum provides *bin/sshpass
```
ps1aniuge
2019-05-07 22:11:17 +08:00
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 连接
omph
2019-05-08 00:16:59 +08:00
@Firxiao No Matches found.
liangzi
2019-05-08 06:20:02 +08:00
@ps1aniuge 你这个如果频繁切换登录服务器和频繁切换本地机器的话改起来很麻烦 还不如楼主这个
楼主只是放出了一部分代码 不过已经够了 写个read 读取一下用户输入 就能实现每次都自定义用户名密码主机名 密钥指定目录
ps1aniuge
2019-05-11 10:41:13 +08:00
如果频繁切换登录服务器-----------你说的对,经过考量我写死了密码。
但是我正考虑开发下一个版本,使用 csv 文件存储 root 密码,和服务器 ip。有人想要么?
einverne
2020-01-14 17:26:58 +08:00
如果是自己的机器为何不 ssh-copy-id
omph
2020-01-14 20:29:54 +08:00
@einverne #17 就是对 ssh-copy-id 的封装
不是自己的机器,都是虚拟机

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

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

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

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

© 2021 V2EX