• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Thronds

            一問你會什么 二問你做出過什么 三問你為了什么

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              36 隨筆 :: 0 文章 :: 56 評論 :: 0 Trackbacks
            在網(wǎng)上找到一篇文章,講在UNIX下自動登錄telnet(http://www.linuxeden.com/forum/t138058.html。這個例子很不錯,下邊對其進(jìn)行分析。
            #===========autotelnet.sh==============
            #!/bin/bash

            tmptty=`tty` #
            取得當(dāng)前的tty
            tmptty=`basename $tmptty` #去掉tty的絕對路徑
            tmpname=`whoami` #取得當(dāng)前執(zhí)行程序的用戶名
            ip="10.22.33.44" #目標(biāo)主機(jī)地址
            inp1="ABC^M" #主機(jī)的用戶名,注意^M必須在UNIX下重裝用以下方法輸入才能用?。?br>#方法為按住ctrl鍵按v鍵,不放ctrl鍵,再按shift鍵和m鍵,完成后全部放開
            inp2="ABC^M" #主機(jī)的密碼,注意必須有^M
            inp3=
            "ls^M" #其他進(jìn)入后的命令,可無或用ls之類的命令代替,注意必須有^M
            inp4=
            "pwd^M" #命令4,同上
            #--------------------------

            inputfile=in #
            導(dǎo)入文件管道用的,不要改,這個值沒有任何關(guān)系
            outputfile=out.log #最終導(dǎo)出的文件
            rm -fr $inputfile
            rm -fr $outputfile
            mknod $inputfile p
            touch $outputfile

            #file de
            scription 7 for out and 8 for in 使用7作為輸入管道,8作為輸入
            exec 7<>$outputfile
            exec 8<>$inputfile

            telnet $ip <&8 >&7 &

            sleep 2; echo $inp1 >> $inputfile #
            看得懂吧
            sleep 2; echo $inp2 >> $inputfile
            sleep 2; echo $inp3 >> $inputfile #
            如果沒有其他命令,這行和下一行可以去掉
            sleep 2; echo $inp4 >> $inputfile

            tail -f $outputfile &
            強制在屏幕上顯示任何輸入輸出

            while true #
            正常情況下已經(jīng)進(jìn)入目標(biāo)主機(jī)了,可以輸入任何命令,所有的一切輸入輸出都會被記錄
            do
            read str
            if [[ $str =
            "quit" || $str = "exit" ]]
            then echo $str >> $inputfile exit
            else echo $str >> $inputfile
            fi
            done

            #
            退出時自動殺掉相關(guān)進(jìn)程
            ps -ef | grep telnet | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk '{print " kill -9", $2}' | sh
            ps -ef | grep tail | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk
            '{print " kill -9", $2}' | sh
            這段代碼實現(xiàn)的功能是在UNIX系統(tǒng)上執(zhí)行這個腳本,自動登錄到腳本中變量<ip>聲明使用的主機(jī)上,并用腳本中<inp1>變量和<inp2>的值分別作為用戶名和密碼進(jìn)行身份驗證。然后,用戶可以在控制臺上輸入任何命令,這些命令會被發(fā)送到遠(yuǎn)端主機(jī)執(zhí)行。因此,我猜測這個腳本的作用和SecureCRT等TELNET工具提供的自動登錄的功能是一樣的。
             
            這個例子的主要原理是這樣的:用后臺方式啟動一個telnet進(jìn)程。將這個進(jìn)程的輸入重定向到一個管道文件in,向這個管道文件追加要執(zhí)行的指令,也就是將指令傳送到telnet進(jìn)程中執(zhí)行;同時,將這個進(jìn)程的輸出重定向至一個日志文件out.log中,tail –f這個日志文件,就是實時刷新telnet的輸出。
             
            這里有幾個細(xì)節(jié)問題需要說明一下:
            1、 向管道文件寫入要執(zhí)行的命令時,必須有一個結(jié)束標(biāo)志,告訴telnet啟動的shell進(jìn)程這是一個完整的命令,可以執(zhí)行了。這個結(jié)束標(biāo)志就是” ^M”。這個東西的輸入還很復(fù)雜。按照作者的說明,要在UNIX系統(tǒng)上,按住Ctrl鍵后按v鍵,松開v鍵保持Ctrl鍵不放,然后按下Shift鍵后再按M鍵,然后同時放開Ctrl Shilf和M三個鍵。在實際使用中發(fā)現(xiàn),不需要Shift鍵,放開v鍵之后直接按m鍵即可;
            2、 在重定向telnet后臺進(jìn)程的輸入時,因為要控制輸入內(nèi)容的速度(要等到出現(xiàn)login以后才能輸入用戶名),所以不能采用文件中直接保存用戶名、密碼及所有要執(zhí)行指令的方式,要求in文件是空的。
            3、 在重定向telnet后臺進(jìn)程的輸入、輸出時,必須使用文件描述符。具體原因還不清楚,但用文件名稱進(jìn)行重定向就不行; 
            4、 在用戶輸入quit或exit后,需要退出后臺telnet進(jìn)程以及tail –f進(jìn)程。腳本中采用kill進(jìn)程的方式實現(xiàn)這一目標(biāo)。因為kiill進(jìn)程時需要一些參數(shù),因此在腳本的開始處記錄了tty的類型等信息;
            對于腳本中具體指令的解釋,參加如下列表中的注釋
            #!/bin/bash

            tmptty=`tty`   
            #取得當(dāng)前的tty
            tmptty=`basename $tmptty`  #去掉tty的絕對路徑
            tmpname=`whoami`          #取得當(dāng)前執(zhí)行程序的用戶名
                                     
            #以上信息在最后kill進(jìn)程時作為篩選條件使用
            ip="10.22.33.44"            #目標(biāo)主機(jī)地址
            inp1="ABC^M"             #主機(jī)的用戶名。注意^M必須在UNIX下重裝用以下方法輸入才能用??!
                                     
             #方法為按住ctrl鍵按v鍵,不放ctrl鍵,再按shift鍵和m鍵,完成后全部放開
                                     
            #經(jīng)過實際使用,不比按shilf鍵也可以
            inp2="ABC^M"             #主機(jī)的密碼,注意必須有^M
            inp3="ls^M"                 #其他進(jìn)入后的命令,可無或用ls之類的命令代替,注意必須有^M
            inp4=
            "pwd^M"               #命令4,同上
            #--------------------------

            inputfile=in                    #
            將命令導(dǎo)入后臺telnet進(jìn)程用的管道文件名稱
            outputfile=out.log               #包含telnet后臺進(jìn)程輸入的文件名稱
            rm -fr $inputfile                
            rm -fr $outputfile               
            mknod $inputfile p              #
            建立管道文件
            touch $outputfile                #
            建立輸出文件


            exec 7<>$outputfile             #將文件描述符7分配給outputfile
            exec 8<>$inputfile              #
            將文件描述符8分配給inputfile

            telnet $ip <&8 >&7 &            #
            后臺運行telent,同時重定向輸入、輸出

            sleep 2; echo $inp1 >> $inputfile  #2
            秒后輸入用戶名
            sleep 2; echo $inp2 >> $inputfile   #2秒后輸入密碼
            sleep 2; echo $inp3 >> $inputfile   #2
            秒后輸入命令inp3
            sleep 2; echo $inp4 >> $inputfile   #2秒后輸入命令inp3
                                         
            #這里面inp3inp4只是一個說明,對自動登錄實際上沒有什么作用
            tail -f $outputfile &              強制在屏幕上顯示任何輸入輸出

            while true        #
            正常情況下已經(jīng)進(jìn)入目標(biāo)主機(jī)了,可以輸入任何命令,所有的一切輸入輸出都會被記錄
            do
            read str
            if [[ $str =
            "quit" || $str = "exit" ]]
            then echo $str >> $inputfile exit   #
            這里的exit實際上是從循環(huán)中退出
            else echo $str >> $inputfile
            fi
            done

            #
            退出時自動殺掉相關(guān)進(jìn)程
            ps -ef | grep telnet | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk '{print " kill -9", $2}' | sh
            ps -ef | grep tail | grep -v grep | grep -v telnetd | grep $tmptty | grep $tmpname | awk
            '{print " kill -9", $2}' | sh
             
            明白了這個腳本的原理,我們可以做一個試驗,用另外一種更加明顯的方式來做輸入輸出的重定向。
             
            1、新建1個普通文件    touch out.log
            2、新建一個管道文件:   mknod commands p
            3、為日志文件分配文件描述符7 : exec 7<>out.log
            4、為管道文件分配文件描述符8:   exec 8<>commands
            5、后臺方式啟動telnet:             telnet 136.30.75.102 <&8 >&7 &
            6、實時刷新輸出信息:             tail –f out.log
            7、另外啟動一個終端,輸入信息: echo “root^M” >>commands
                                             echo “password^M”>>commands
                                             echo “pwd^M” >> commands
                                               ….
            8、觀察tail –f的輸出,可以看到輸入命令的執(zhí)行結(jié)果。
             
             
            在這個腳本的基礎(chǔ)上,可以實現(xiàn)自動telnet到一個主機(jī)上并執(zhí)行一些列command的功能。腳本如下:
            #!/bin/bash
             
            tmptty=`tty`
            tmptty=`basename $tmptty`
            tmpname=`whoami`
            ip="136.39.75.102"
            inp1="root^M"
            inp2="Easy2get^M"
            #####################################################################
            #you may add as many commands as you want
            #NOTE:every command should end with ^M, which is input under UNIX
            #     方法為按住ctrl鍵按v鍵,不放ctrl鍵,再按shift鍵和m鍵,完成后全部放開
            #####################################################################
            inp3="ls^M"
            inp4="echo 'hello,TeMIP users' >> hello.txt^M"
             
            #--------------------------
             
            inputfile=in
            outputfile=out.log
            rm -fr $inputfile
            rm -fr $outputfile
            mknod $inputfile p
            touch $outputfile
             
             
            exec 7<>$outputfile
            exec 8<>$inputfile
             
            telnet $ip <&8 >&7 &
             
            sleep 2; echo $inp1 >> $inputfile
            sleep 2; echo $inp2 >> $inputfile
             
            echo "executing command $inp3"
            sleep 2; echo $inp3 >> $inputfile
            echo "executing $inp4"
            sleep 2; echo $inp4 >> $inputfile
            echo "exiting"
            sleep 2; echo "exit^M" >> $inputfile
             
             
            rm $inputfile
            rm $outputfile
             
            附錄:Shell中的輸入/輸出
            (摘自HP-UX 參考手冊 用戶命令 ksh)
            命令執(zhí)行之前,其輸入和輸出可以使用專用表示法重定向由Shell 解釋。下列內(nèi)容可以出現(xiàn)在簡單命令內(nèi)的任何位置,或在命令之前之后,并且不傳遞給調(diào)用命令。命令和參數(shù)替換發(fā)生在使用word 或digit 之前,除非如下所示。文件名生成僅出現(xiàn)在模式匹配單一文件且不執(zhí)行空白解釋時。
            l         <word 使用文件word 作為標(biāo)準(zhǔn)輸入(文件描述符0 )。
            l         >word 使用文件word 作為標(biāo)準(zhǔn)輸出(文件描述符1 )。如果不存在該文件,將另行創(chuàng)建。如果文件存在,并且使用noclobber 選項,則發(fā)生錯誤;否則文件被截斷為零長度。
            l         >|word 與> 相同,區(qū)別在于覆蓋noclobber 選項。
            l         >>word 使用文件word 作為標(biāo)準(zhǔn)輸出。如果文件存在,追加輸出到其中(通過首先搜索文件末尾);否則,另行創(chuàng)建文件。
            l         <>word 打開文件word 作為標(biāo)準(zhǔn)輸入以進(jìn)行讀取和寫入。如果不存在該文件,將另行創(chuàng)建。
            l         <<[ - ]word 讀取Shell 輸入直至出現(xiàn)行與word 匹配,或者抵達(dá)文件末尾。在word 上沒有執(zhí)行參數(shù)替換、命令替換或文件名生成。得到的文檔稱為本文檔,作為標(biāo)準(zhǔn)輸入。如果引用word 的任意字符,不對文檔字符進(jìn)行解釋。否則,發(fā)生參數(shù)和命令替換,忽略\newline,必須使用\ 引用字符\ 、$ 、‘ 和word 的第一個字符。如果- 追加到<< ,則從word 和文檔去掉所有前導(dǎo)制表符。
            l         <&digit 從文件描述符復(fù)制標(biāo)準(zhǔn)輸入digit (請參閱dup(2) )。
            l         >&digit 標(biāo)準(zhǔn)輸出復(fù)制到文件描述符digit (請參閱dup(2) )。
            l         <&- 標(biāo)準(zhǔn)輸入關(guān)閉。
            l         >&- 標(biāo)準(zhǔn)輸出關(guān)閉。
            l         <&p 來自聯(lián)合進(jìn)程的輸入移動到標(biāo)準(zhǔn)輸入。
            l         >&p 到聯(lián)合進(jìn)程去的輸出移動到標(biāo)準(zhǔn)輸出。
            如果上述一項有數(shù)字前導(dǎo),文件描述符號引用由該數(shù)字指定(取代缺省的0 或1 )。例如:
            ... 2>&1
            意味著文件描述符2 打開,作為文件描述符1 的副本用于寫入。重定向順序很重要,因為Shell 根據(jù)當(dāng)前打開文件在計算時與指定文件描述符的關(guān)聯(lián)計算重定向引用文件描述符。例如:
            ... 1>fname 2>&1
            首先分配文件描述符1(標(biāo)準(zhǔn)輸出)給文件fname ,然后分配文件描述符2(標(biāo)準(zhǔn)錯誤)給分配給文件描述符1的文件,也就是fname 。另一方面,如果重定向順序反轉(zhuǎn)如下:
            ... 2>&1 1>fname
            文件描述符2 分配給當(dāng)前標(biāo)準(zhǔn)輸出,(用戶終端,除非繼承了不同的分配)。此時文件描述符1 重新分配給文件fname ,不更改文件描述符2 的分配。
            co-process 的輸入和輸出可移動到多個文件描述符,允許其他命令使用上述重定向運算符向其中寫入和讀取。如果當(dāng)前co-process 輸入移動到多個文件描述符,另一個co-process 開始。
            如果命令后跟隨& 并且作業(yè)控制非活動狀態(tài),命令的缺省標(biāo)準(zhǔn)輸入為空文件/dev/null 。否則,執(zhí)行命令的環(huán)境包括調(diào)用Shell 的文件描述符,通過輸入/輸出規(guī)格修改
            http://blog.csdn.net/muyuqing/archive/2007/04/27/1586824.aspx
            posted on 2009-04-18 21:18 thronds 閱讀(2189) 評論(4)  編輯 收藏 引用 所屬分類: Linux/Unix高級技術(shù)

            評論

            # re: zz自動登錄telnet執(zhí)行若干command 2009-05-05 17:21 雅各布
            telnet $ip <&8 >&7 &

            為什么我的腳本在運行時,在該處都會告警
            “getwinsize:ioctl: A specified file does not support the ioctl system call.”  回復(fù)  更多評論
              

            # re: zz自動登錄telnet執(zhí)行若干command 2009-05-05 17:22 雅各布
            是不是權(quán)限的問題??  回復(fù)  更多評論
              

            # re: zz自動登錄telnet執(zhí)行若干command 2010-08-08 01:25 BlevinsVicki
            This is understandable that cash can make us free. But how to act if somebody does not have money? The one way is to try to get the <a href="http://bestfinance-blog.com/topics/credit-loans">credit loans</a> and just sba loan.   回復(fù)  更多評論
              

            # re: zz自動登錄telnet執(zhí)行若干command 2010-08-11 21:21 Custom thesis
            You have to be really imaginative person to create this really hot dissertation writing just about this good topic . I like to buy essays and thesis about that stuff. Thanks a lot!   回復(fù)  更多評論
              

            青草国产精品久久久久久| 亚洲精品乱码久久久久久久久久久久 | 香蕉久久AⅤ一区二区三区| 久久久久久A亚洲欧洲AV冫| 亚洲午夜久久久| 亚洲∧v久久久无码精品| 91久久婷婷国产综合精品青草| 国产一区二区精品久久| 久久综合一区二区无码| 久久天天婷婷五月俺也去| 久久超乳爆乳中文字幕| 久久久久久极精品久久久| 一本久久a久久精品亚洲| 久久青青草原精品影院| 亚洲一级Av无码毛片久久精品| 国产午夜免费高清久久影院| 久久久WWW成人免费精品| 99久久国语露脸精品国产| 久久久久亚洲av成人无码电影| 久久久免费精品re6| 亚洲另类欧美综合久久图片区| 精品国产一区二区三区久久| 久久亚洲中文字幕精品一区| 国产99久久九九精品无码| 日日噜噜夜夜狠狠久久丁香五月| 久久性精品| 九九热久久免费视频| 久久99精品久久久久久久不卡| 国内精品久久久久影院亚洲| 久久精品国产72国产精福利| 国内精品伊人久久久久| 国产V亚洲V天堂无码久久久| 无码八A片人妻少妇久久| 欧美日韩成人精品久久久免费看| 99热热久久这里只有精品68| 狠狠色婷婷久久一区二区三区| 亚洲αv久久久噜噜噜噜噜| 久久精品亚洲AV久久久无码| 亚洲人成伊人成综合网久久久| 亚洲精品WWW久久久久久| 亚洲国产成人久久笫一页 |