V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coolwinds
V2EX  ›  程序员

shell 小白请教一个脚本问题

  •  
  •   Coolwinds · 274 天前 · 1417 次点击
    这是一个创建于 274 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 功能是公司一些服务器密码就那么几个,但是每次都要尝试几次很烦,所以通过脚本去尝试密码并记录。
    • 逻辑是每次从 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 [email protected]${test_ip} "exit" || sshpass -p ${pwd_list} ssh -o StrictHostKeyChecking=no [email protected]${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  
       274 天前
    咋不加公钥
    proxychains
        2
    proxychains  
       274 天前
    抱歉我答非所问了.
    mango88
        3
    mango88  
       274 天前   ❤️ 1
    不是很清楚是什么原因,换一种方式是 OK 的
    ```
    for row in $(cat hostip.txt)
    do
    test_ip=$row
    funTstPass
    done
    ```
    wxf666
        4
    wxf666  
       274 天前   ❤️ 1
    可能 sshpass 有使用你的 stdin 吧
    dbg
        5
    dbg  
       274 天前   ❤️ 1
    可能跟 IFS 有关系.提前设置下 IFS.
    runwu2022
        6
    runwu2022  
       274 天前
    hxy100
        7
    hxy100  
       274 天前
    你代码里面 funTstPass 函数有一行加了 break ,打断了循环,你把 break 去掉就好了
    hxy100
        8
    hxy100  
       274 天前
    @hxy100 不好意思,眼睛看花了,当我这句话没发
    hxy100
        9
    hxy100  
       274 天前   ❤️ 1
    经过测试,原因就是如四楼所言,sshpass 使用你的 stdin ,可以照 3 楼代码改写你读取 txt 文件部分的逻辑,
    另外一种办法:也可以简单将你贴出代码的倒数第二行由 funTstPass 改成 funTstPass</dev/null 即可;
    Coolwinds
        10
    Coolwinds  
    OP
       273 天前
    @hxy100 感谢解答,看来部分知识还是欠缺
    panzhc
        11
    panzhc  
       270 天前
    我一般是这么写的

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