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

ssh 自动登陆脚本的问题

  •  
  •   omph · 161 天前 · 2255 次点击
    这是一个创建于 161 天前的主题,其中的信息可能已经有所发展或是发生改变。

    打算做一个 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 [email protected]$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 条附言  ·  160 天前

    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 [email protected]$host;
        expect {
            *(yes/no)?* { send yes\r; exp_continue; }
            "*try again*" { exit 1; }   # 密码错误时直接退出,错误码 1
            *password:* { send $pass\r; exp_continue; }
            eof         { exit 0; }
        };
    EOF
    }
    
    16 回复  |  直到 2019-05-11 10:41:13 +08:00
        1
    omph   161 天前
    用 debug 解决了,expect -d
    出错时的信息:\r\nPermission denied, please try again.\r\r\[email protected]'s password:
    会先匹配到*password:*
    怪不得有些例子里多用 -exact
        2
    asilin   161 天前
    为什么要重复造轮子?直接使用 sshpass 命令就行。
        3
    dorothyREN   161 天前
    用密钥登录不好吗
        4
    justin2018   161 天前   ♥ 1
    shuttle mac 用这个 还不错~
        5
    loriri   160 天前
    用密钥登录不好吗
        6
    hackyuan   160 天前 via Android
    秘钥 + config 连 ip、端口都不用记
        7
    omph   160 天前
    @asilin centos 源里没有,要自己编译,换个使用环境就麻烦了

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

    @hackyuan 经常用别人的机器登陆服务器,😒
        8
    wunonglin   160 天前   ♥ 1
    推荐 Termius,mac、pc、android、ios 多端同步,让您放假的时候也能随时随地维护服务器
        9
    liangzi   160 天前
    为嘛我试了一下不行呢
        10
    omph   160 天前
    @liangzi 我用着可以了
    有出错信息吗?
        11
    liangzi   160 天前
    @omph 弄好了 没事了 谢谢
        12
    Firxiao   159 天前   ♥ 1
    @omph
    ```
    yum provides *bin/sshpass
    ```
        13
    ps1aniuge   159 天前   ♥ 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 连接
        14
    omph   159 天前
    @Firxiao No Matches found.
        15
    liangzi   159 天前
    @ps1aniuge 你这个如果频繁切换登录服务器和频繁切换本地机器的话改起来很麻烦 还不如楼主这个
    楼主只是放出了一部分代码 不过已经够了 写个read 读取一下用户输入 就能实现每次都自定义用户名密码主机名 密钥指定目录
        16
    ps1aniuge   156 天前
    如果频繁切换登录服务器-----------你说的对,经过考量我写死了密码。
    但是我正考虑开发下一个版本,使用 csv 文件存储 root 密码,和服务器 ip。有人想要么?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4281 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 06:31 · PVG 14:31 · LAX 23:31 · JFK 02:31
    ♥ Do have faith in what you're doing.