V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
omph
V2EX  ›  Linux

ssh 自动登陆脚本的问题

  •  
  •   omph · 2019-05-06 11:34:33 +08:00 · 5472 次点击
    这是一个创建于 2026 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2019-05-06 16:24:07 +08:00

    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
    }
    
    18 条回复    2020-01-14 20:29:54 +08:00
    omph
        1
    omph  
    OP
       2019-05-06 12:18:32 +08:00
    用 debug 解决了,expect -d
    出错时的信息:\r\nPermission denied, please try again.\r\r\[email protected]'s password:
    会先匹配到*password:*
    怪不得有些例子里多用 -exact
    asilin
        2
    asilin  
       2019-05-06 12:29:49 +08:00
    为什么要重复造轮子?直接使用 sshpass 命令就行。
    dorothyREN
        3
    dorothyREN  
       2019-05-06 13:02:51 +08:00
    用密钥登录不好吗
    justin2018
        4
    justin2018  
       2019-05-06 13:58:43 +08:00   ❤️ 1
    shuttle mac 用这个 还不错~
    loriri
        5
    loriri  
       2019-05-06 15:08:46 +08:00
    用密钥登录不好吗
    hackyuan
        6
    hackyuan  
       2019-05-06 15:12:15 +08:00 via Android
    秘钥 + config 连 ip、端口都不用记
    omph
        7
    omph  
    OP
       2019-05-06 16:21:14 +08:00
    @asilin centos 源里没有,要自己编译,换个使用环境就麻烦了

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

    @hackyuan 经常用别人的机器登陆服务器,😒
    wunonglin
        8
    wunonglin  
       2019-05-06 16:30:20 +08:00   ❤️ 1
    推荐 Termius,mac、pc、android、ios 多端同步,让您放假的时候也能随时随地维护服务器
    liangzi
        9
    liangzi  
       2019-05-07 07:33:04 +08:00
    为嘛我试了一下不行呢
    omph
        10
    omph  
    OP
       2019-05-07 10:12:54 +08:00
    @liangzi 我用着可以了
    有出错信息吗?
    liangzi
        11
    liangzi  
       2019-05-07 10:27:31 +08:00
    @omph 弄好了 没事了 谢谢
    Firxiao
        12
    Firxiao  
       2019-05-07 17:26:07 +08:00   ❤️ 1
    @omph
    ```
    yum provides *bin/sshpass
    ```
    ps1aniuge
        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 连接
    omph
        14
    omph  
    OP
       2019-05-08 00:16:59 +08:00
    @Firxiao No Matches found.
    liangzi
        15
    liangzi  
       2019-05-08 06:20:02 +08:00
    @ps1aniuge 你这个如果频繁切换登录服务器和频繁切换本地机器的话改起来很麻烦 还不如楼主这个
    楼主只是放出了一部分代码 不过已经够了 写个read 读取一下用户输入 就能实现每次都自定义用户名密码主机名 密钥指定目录
    ps1aniuge
        16
    ps1aniuge  
       2019-05-11 10:41:13 +08:00
    如果频繁切换登录服务器-----------你说的对,经过考量我写死了密码。
    但是我正考虑开发下一个版本,使用 csv 文件存储 root 密码,和服务器 ip。有人想要么?
    einverne
        17
    einverne  
       2020-01-14 17:26:58 +08:00
    如果是自己的机器为何不 ssh-copy-id
    omph
        18
    omph  
    OP
       2020-01-14 20:29:54 +08:00
    @einverne #17 就是对 ssh-copy-id 的封装
    不是自己的机器,都是虚拟机
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1550 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:07 · PVG 01:07 · LAX 09:07 · JFK 12:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.