V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Coolwinds
V2EX  ›  程序员

shell 小白请教一个脚本问题

  •  
  •   Coolwinds · Sep 9, 2022 · 2420 views
    This topic created in 1335 days ago, the information mentioned may be changed or developed.
    • 功能是公司一些服务器密码就那么几个,但是每次都要尝试几次很烦,所以通过脚本去尝试密码并记录。
    • 逻辑是每次从 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 replies    2022-09-13 20:32:04 +08:00
    proxychains
        1
    proxychains  
       Sep 9, 2022
    咋不加公钥
    proxychains
        2
    proxychains  
       Sep 9, 2022
    抱歉我答非所问了.
    mango88
        3
    mango88  
       Sep 9, 2022   ❤️ 1
    不是很清楚是什么原因,换一种方式是 OK 的
    ```
    for row in $(cat hostip.txt)
    do
    test_ip=$row
    funTstPass
    done
    ```
    wxf666
        4
    wxf666  
       Sep 9, 2022   ❤️ 1
    可能 sshpass 有使用你的 stdin 吧
    dbg
        5
    dbg  
       Sep 9, 2022   ❤️ 1
    可能跟 IFS 有关系.提前设置下 IFS.
    runwu2022
        6
    runwu2022  
       Sep 9, 2022
    hxy100
        7
    hxy100  
       Sep 9, 2022
    你代码里面 funTstPass 函数有一行加了 break ,打断了循环,你把 break 去掉就好了
    hxy100
        8
    hxy100  
       Sep 9, 2022
    @hxy100 不好意思,眼睛看花了,当我这句话没发
    hxy100
        9
    hxy100  
       Sep 9, 2022   ❤️ 1
    经过测试,原因就是如四楼所言,sshpass 使用你的 stdin ,可以照 3 楼代码改写你读取 txt 文件部分的逻辑,
    另外一种办法:也可以简单将你贴出代码的倒数第二行由 funTstPass 改成 funTstPass</dev/null 即可;
    Coolwinds
        10
    Coolwinds  
    OP
       Sep 10, 2022
    @hxy100 感谢解答,看来部分知识还是欠缺
    panzhc
        11
    panzhc  
       Sep 13, 2022
    我一般是这么写的

    ```sh
    exec 3<./hostip.txt
    while read -u 3 line; do
    test_ip=$line
    funTstPass
    done
    exec 3>&-
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1165 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 23:09 · PVG 07:09 · LAX 16:09 · JFK 19:09
    ♥ Do have faith in what you're doing.