V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Coolwinds
V2EX  ›  程序员

shell 小白请教一个脚本问题

  •  
  •   Coolwinds · 2022-09-09 10:42:16 +08:00 · 1797 次点击
    这是一个创建于 825 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 功能是公司一些服务器密码就那么几个,但是每次都要尝试几次很烦,所以通过脚本去尝试密码并记录。
    • 逻辑是每次从 hostip.txt 中读取一个 ip ,然后扔到上面的循环里去试密码并记录
    • 问题是每次读取完第一个 IP 并试完密码,循序就结束了,下面也提示在 read rows 。百思不得其解,求解答
    ## 密码列表,空格分隔
    pwd_lists="passwd1 passwd2 passwd3 passwd4 passwd5"
    ## 记录找到的密码
    psss_history_file="pwd_history.txt"
    
    funTstPass(){
        for pwd_list in ${pwd_lists}
        do
            sshpass -p ${pwd_list} ssh -o StrictHostKeyChecking=no centos@${test_ip} "exit" || sshpass -p ${pwd_list} ssh -o StrictHostKeyChecking=no root@${test_ip} "exit"
            if [ $? -eq 0 ];then
                echo -e "\n[ Success ] IP=\"$test_ip\"  password=\"${pwd_list}\" "
                echo "$test_ip   ${pwd_list}" >> ${psss_history_file}
                break
            else
                echo "[ Failure ] password=\"${pwd_list}\""
            fi
        done
    }
    cat hostip.txt | while read rows
    do
      test_ip=$rows
      funTstPass
    done:
    
    + pwd_lists="passwd1 passwd2 passwd3 passwd4 passwd5"
    + psss_history_file=pwd_history.txt
    + cat hostip.txt
    + read rows
    + test_ip=10.0.0.50
    + funTstPass
    + for pwd_list in ${pwd_lists}
    + sshpass -p 'passwd1' ssh -o StrictHostKeyChecking=no [email protected] exit
    Permission denied, please try again.
    + sshpass -p 'passwd1' ssh -o StrictHostKeyChecking=no [email protected] exit
    + '[' 0 -eq 0 ']'
    + echo -e '\n[ Success ] IP="10.0.0.50"  password="passwd1" '
    
    [ Success ] IP="10.0.0.50"  password="passwd1" 
    + echo '10.0.0.50   passwd1'
    + break
    + read rows
    
    11 条回复    2022-09-13 20:32:04 +08:00
    proxychains
        1
    proxychains  
       2022-09-09 11:22:48 +08:00
    咋不加公钥
    proxychains
        2
    proxychains  
       2022-09-09 11:23:03 +08:00
    抱歉我答非所问了.
    mango88
        3
    mango88  
       2022-09-09 11:37:59 +08:00   ❤️ 1
    不是很清楚是什么原因,换一种方式是 OK 的
    ```
    for row in $(cat hostip.txt)
    do
    test_ip=$row
    funTstPass
    done
    ```
    wxf666
        4
    wxf666  
       2022-09-09 11:39:50 +08:00   ❤️ 1
    可能 sshpass 有使用你的 stdin 吧
    dbg
        5
    dbg  
       2022-09-09 11:42:19 +08:00   ❤️ 1
    可能跟 IFS 有关系.提前设置下 IFS.
    runwu2022
        6
    runwu2022  
       2022-09-09 16:21:47 +08:00
    hxy100
        7
    hxy100  
       2022-09-09 21:58:17 +08:00
    你代码里面 funTstPass 函数有一行加了 break ,打断了循环,你把 break 去掉就好了
    hxy100
        8
    hxy100  
       2022-09-09 22:00:57 +08:00
    @hxy100 不好意思,眼睛看花了,当我这句话没发
    hxy100
        9
    hxy100  
       2022-09-09 22:22:56 +08:00   ❤️ 1
    经过测试,原因就是如四楼所言,sshpass 使用你的 stdin ,可以照 3 楼代码改写你读取 txt 文件部分的逻辑,
    另外一种办法:也可以简单将你贴出代码的倒数第二行由 funTstPass 改成 funTstPass</dev/null 即可;
    Coolwinds
        10
    Coolwinds  
    OP
       2022-09-10 10:17:16 +08:00
    @hxy100 感谢解答,看来部分知识还是欠缺
    panzhc
        11
    panzhc  
       2022-09-13 20:32:04 +08:00
    我一般是这么写的

    ```sh
    exec 3<./hostip.txt
    while read -u 3 line; do
    test_ip=$line
    funTstPass
    done
    exec 3>&-
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5390 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:57 · PVG 10:57 · LAX 18:57 · JFK 21:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.