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

ssh 自动登陆脚本的问题

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

    打算做一个 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 经常用别人的机器登陆服务器,
    shakaraka
        8
    shakaraka  
    PRO
       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     Solana     5539 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 07:29 PVG 15:29 LAX 00:29 JFK 03:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86