新聞中心

        EEPW首頁(yè) > 業(yè)界動(dòng)態(tài) > 避免 UNIX 和 Linux 中的常見(jiàn)錯(cuò)誤

        避免 UNIX 和 Linux 中的常見(jiàn)錯(cuò)誤

        作者: 時(shí)間:2014-11-25 來(lái)源: 收藏

        您是否遇到過(guò) Execute permission deniedThe parameter list is too long 這樣的錯(cuò)誤消息?您想知道錯(cuò)誤的原因嗎?這些是 新手經(jīng)常遇到的錯(cuò)誤,他們可能不知道如何避免這些問(wèn)題。本文解釋這些錯(cuò)誤并提供解決方法。

        本文引用地址:http://www.104case.com/article/265909.htm

        ./foo: 0403-006 Execute permission denied.

        您編寫(xiě)或下載了一個(gè)新的 shell 腳本,很想試試它。這聽(tīng)起來(lái)不錯(cuò),但是在試圖執(zhí)行這個(gè)命令時(shí),收到了錯(cuò)誤消息 ./foo: 0403-006 Execute permission denied。怎么回事兒?這個(gè)消息可能源于兩個(gè)問(wèn)題:

        • 您不具有執(zhí)行這個(gè)命令的足夠權(quán)限。

        • 對(duì)于腳本中定義的 shell,您不具有足夠的權(quán)限,無(wú)法告訴 shell 應(yīng)該如何解釋腳本和其中的命令。

        您不具有執(zhí)行這個(gè)命令的足夠權(quán)限

        檢查權(quán)限最簡(jiǎn)便的方法是,查看您是作為哪個(gè)用戶(hù)登錄服務(wù)器的,然后查看 ls –l 的輸出:

        # id
        uid=5008(cormany) gid=330(atc) groups=110(sales),201(sshd)
        
        # ls -l foo
        -rwxrw-r--    1 cormany  atc              75 Jun 10 18:46 foo

        根據(jù)這個(gè)示例,您是作為用戶(hù) cormany 登錄的,而 shell 腳本的所有者是 cormany,他具有 rwx 權(quán)限(即讀、寫(xiě)和執(zhí)行)。這沒(méi)問(wèn)題,所以我們考慮下一個(gè)可能的原因。

        對(duì)于腳本中定義的 shell,您不具有足夠的權(quán)限,無(wú)法告訴 shell 應(yīng)該如何解釋腳本和其中的命令

        我們來(lái)看看腳本的內(nèi)部:

        # cat foo
        
        #!/bin/ksh.new
        
        echo "This is a just a test"
        
        exit 0

        根據(jù)第一行,這個(gè)腳本看起來(lái)應(yīng)該作為 Korn shell 腳本進(jìn)行解釋。通過(guò)檢查所用的 shell 的權(quán)限,可以確認(rèn)實(shí)際上是否可以使用它:

        # ls –l /bin/ksh.new
        
        -r-xr-x---    5 bin      bin          289072 May 27 19:03 /bin/ksh.new

        作為 root 用戶(hù),修改要使用的 shell 的文件權(quán)限,然后再試一次:

        1. 切換為 root 用戶(hù):

          # su -
          root's Password:


        2. 確認(rèn)您現(xiàn)在是 root 用戶(hù)而不是原來(lái)的用戶(hù):

          # id
          uid=0(root) gid=0(system) groups=2(bin),3(sys),7(security),8(cron),10(audit),11(lp)


        3. 修改文件的權(quán)限:

          # chmod 555 /bin/ksh.new


        4. 確認(rèn)文件權(quán)限已經(jīng)改變了:

          # ls -l /bin/ksh.new
          -r-xr-xr-x    1 bin      bin          289072 Jun 10 18:45 /bin/ksh.new


        5. 退出 su,恢復(fù)為原來(lái)的用戶(hù):

          # exit
          # id
          uid=5008(cormany) gid=330(atc) groups=110(sales),201(sshd)


        6. 再次嘗試執(zhí)行腳本:

          # ./foo
          This is a just a test


        好了,問(wèn)題解決了!

        ksh: bar: not found.

        您編寫(xiě)了另一個(gè)腳本 bar 并把它保存在 ~cormany/scripts 目錄中。在使用完整路徑或在當(dāng)前工作目錄 (~cormany/scripts) 中執(zhí)行這個(gè)腳本時(shí),它工作正常;但是,由于某種原因,如果在另一個(gè)目錄中只輸入腳本名,就無(wú)法運(yùn)行它:

        # pwd
        /home/cormany/scripts
        
        # /home/cormany/scripts/bar
        This is another test
        
        # ./bar
        This is another test
        
        # cd
        
        # pwd
        /home/cormany
        
        # barksh: bar:  not found.

        一切正常,只是無(wú)法從另一個(gè)目錄運(yùn)行這個(gè)腳本。這樣的錯(cuò)誤消息通常有三種情況:

        • 對(duì)于試圖執(zhí)行的文件,您沒(méi)有權(quán)限。

        • 文件不存在或不在您認(rèn)為的目錄中。

        • 文件存在而且在預(yù)期的位置,您對(duì)這個(gè)文件也有足夠的權(quán)限。

        對(duì)于試圖執(zhí)行的文件,您沒(méi)有權(quán)限

        您知道不是這個(gè)原因,因?yàn)樵谔峁┩耆薅ǖ穆窂綍r(shí)或在命令目錄中時(shí)能夠執(zhí)行這個(gè)腳本。如果不能排除這種可能性,檢查文件權(quán)限應(yīng)該有助于發(fā)現(xiàn)問(wèn)題的原因:

        # ls -la ~cormany/scripts
        total 56
        drwxr-xr-x    2 cormany  atc             512 Jun 12 08:30 .
        drwxr-xr-x    6 cormany  atc             512 Jun 10 08:21 ..
        -rwxr-xr-x    1 cormany  atc              42 Sep 06 16:20 amdc
        -rw-rw-rw-    1 cormany  atc             154 Jan 27 23:23 atc
        -rwxr-xr-x    1 cormany  atc             206 Aug 04 20:57 atc.2
        -rwxr-xr-x    1 cormany  atc              48 Jun 12 08:21 bar
        -rwxr-xr-x    1 cormany  atc              87 Feb 22 16:11 pac

        執(zhí)行 ~cormany/scripts/atc 命令會(huì)失敗,因?yàn)檫@個(gè)文件只對(duì)用戶(hù)、組和其他用戶(hù)設(shè)置了讀和寫(xiě)權(quán)限。只需增加執(zhí)行權(quán)限,即可解決這個(gè)問(wèn)題。

        如果無(wú)法執(zhí)行另一個(gè)目錄中的另一個(gè)命令(例如 ~cormany/scripts.old/cujo),那么也應(yīng)該檢查那個(gè)文件的權(quán)限:

        # ls -l ~cormany/other_scripts/cujo
        ls: 0653-345 /home/cormany/other_scripts/cujo: Permission denied.

        初看上去,您甚至沒(méi)有讀權(quán)限。我們來(lái)看看目標(biāo)目錄,看看是怎么回事兒:

        # cd ~cormany/scripts.old/cujo
        ksh: /home/cormany/other_scripts: Permission denied.
        
        # ls -l ~cormany/scripts.old/cujo
        ls: /home/cormany/scripts.old: The file access permissions do 
            not allow the specified action.
        total 0

        這里發(fā)生了什么情況?這是另一種形式的權(quán)限錯(cuò)誤。權(quán)限錯(cuò)誤不總是出現(xiàn)在文件本身,也可能出現(xiàn)在文件路徑中的目錄上:

        # ls -ld ~cormany/scripts.old
        d---------    2 cormany  atc             512 Jan 22 08:42 /home/cormany/scripts.old

        如果文件本身有足夠的權(quán)限,那么糾正目錄路徑上的權(quán)限應(yīng)該會(huì)解決執(zhí)行問(wèn)題:

        # chmod 755 ~cormany/other_scripts
        # cd ~cormany/other_scripts
        # ls –l cujo
        -rwxr-xr-x    1 cormany  atc              48 Jan 26 08:21 cujo

        現(xiàn)在,回到原來(lái) ~cormany/scripts/bar 的問(wèn)題。

        文件不存在或不在您認(rèn)為的目錄中

        同樣,使用 ls 命令執(zhí)行快速檢查,應(yīng)該會(huì)看到這個(gè)文件是否存在:

        # ls -l ~cormany/scripts/bar
        -rwxr-xr-x    1 cormany  atc              48 Oct 05 08:21 /home/cormany/scripts/bar

        如果在您原來(lái)認(rèn)為的目錄中沒(méi)有這個(gè)文件,就會(huì)收到以下消息:

        # ls -l ~cormany/scripts/bar
        ls: 0653-341 The file /home/cormany/scripts/bar does not exist.

        如果您認(rèn)為這個(gè)文件在用戶(hù) cormany 的主目錄中的其他地方,可以用 find 命令搜索它(如果您有足夠的權(quán)限的話(huà)):

        # find ~cormany -name "bar" -ls
        16409    1 -rwxr-xr-x  1 cormany   atc   48 Sep 06 08:06 /home/cormany/atc/bar
        590040   1 -rwxr-xr-x  1 cormany   atc   48 Sep 09 08:42 /home/cormany/test/bar

        文件存在而且在預(yù)期的位置,您對(duì)這個(gè)文件也有足夠的權(quán)限

        前面成功執(zhí)行時(shí)采用的方法是提供完全限定的命令路徑,或者處于命令目錄中并輸入當(dāng)前工作目錄(即使用 ./)。既然現(xiàn)在不在命令目錄中,也不輸入完整路徑,我們就來(lái)檢查一下 PATH 環(huán)境變量的值:

        # echo ${PATH}
        /usr/bin:/etc:/usr/sbin:/usr/ucb:/bin:/usr/bin/X11:/sbin:/usr/
            java5/jre/bin:/usr/java5/bin:/usr/ushare/bin:/usr/local/bin

        目錄 /home/cormany/scripts 不在路徑中。糾正這個(gè)問(wèn)題有兩種方法:

        • 在 PATH 中添加 ~cormany/scripts盡管很容易執(zhí)行這個(gè)修改,但是請(qǐng)記住一點(diǎn):每在 PATH 變量中添加一個(gè)目錄,shell 在搜索命令時(shí)就會(huì)多搜索一個(gè)目錄。如果隨著時(shí)間的推移添加了 10 個(gè)目錄,那么在 shell 返回?zé)o法找到文件的結(jié)果之前,它要多搜索 10 個(gè)目錄。如果您確實(shí)要這么做,只需執(zhí)行以下命令:

          # export PATH=${PATH}:/home/cormany/scripts
          # echo $PATH
          /usr/bin:/etc:/usr/sbin:/usr/ucb:/bin:/usr/bin/X11:/sbin:/usr/
              java5/jre/bin:/usr/java5/bin:/usr/ushare/bin:/usr/local/bin:/
              home/cormany/scripts

          注意:把路徑添加到用戶(hù)的 PATH 變量的開(kāi)頭通常是不明智。這么做可能導(dǎo)致執(zhí)行不需要的命令。如果您覺(jué)得必須把一個(gè)路徑放在開(kāi)頭,一定要謹(jǐn)慎。


        • 把腳本轉(zhuǎn)移(或復(fù)制)到 PATH 變量中已有的目錄中。如果多個(gè)用戶(hù)可能使用這個(gè)腳本,這種解決方案比較好。如果是這種情況,用戶(hù)通常把他們的文件放在 /usr/local/bin 中。

        ls: 0653-341 The file . does not exist.

        您正在 ~cormany/scripts 目錄中工作。突然,這個(gè)目錄中的腳本都找不到了,您收到一條奇怪的消息,它說(shuō)當(dāng)前工作目錄不再存在:

        #  ls -l
        total 40
        -rwxr-xr-x    1 cormany  atc              42 Sep 06 16:20 amdc
        -rw-rw-rw-    1 cormany  atc             154 Jan 27 23:23 atc
        -rwxr-xr-x    1 cormany  atc             206 Aug 04 20:57 atc.2
        -rwxr-xr-x    1 cormany  atc              48 Jun 12 08:21 bar
        -rwxr-xr-x    1 cormany  atc              87 Feb 22 16:11 pac
        
        # ./bar
        This is another test
        
        # pwd
        /home/cormany/scripts
        
        # ./barksh: ./bar:  not found.
        
        # ls -lls: 0653-341 The file . does not exist.

        當(dāng)出現(xiàn)這種情況時(shí),就說(shuō)明通過(guò) rm 命令刪除了您原來(lái)的工作目錄。僅僅創(chuàng)建一個(gè)同名的新目錄不會(huì)解決這個(gè)問(wèn)題,因?yàn)槲募枋龇灰粯印?/p>

        出現(xiàn)這種事故常常是因?yàn)槟约涸诹硪粋€(gè)窗口中執(zhí)行了 rm 命令(至少我是這樣)。為了避免這種事故,可以通過(guò) mv 命令修改目錄名。如果修改目錄名,原來(lái)目錄中的用戶(hù)可以繼續(xù)工作,只是采用不同的目錄名,因?yàn)槲募枋龇匀皇窍嗤模?/p>

        #  ls -l
        total 40
        -rwxr-xr-x    1 cormany  atc              42 Sep 06 16:20 amdc
        -rw-rw-rw-    1 cormany  atc             154 Jan 27 23:23 atc
        -rwxr-xr-x    1 cormany  atc             206 Aug 04 20:57 atc.2
        -rwxr-xr-x    1 cormany  atc              48 Jun 12 08:21 bar
        -rwxr-xr-x    1 cormany  atc              87 Feb 22 16:11 pac
        
        # ./bar
        This is another test
        
        # pwd
        /home/cormany/scripts

        同樣,假設(shè)有人在另一個(gè)會(huì)話(huà)中把您正在工作的目錄改為 ~cormany/scripts.20090601。由于只是轉(zhuǎn)移目錄和修改目錄名,您仍然可以繼續(xù)工作:

        # ./bar
        This is another test
        
        # pwd
        /home/cormany/scripts.20090601

        ./foo: /usr/bin/ls: 0403-027 The parameter list is too long.

        一個(gè)程序在您的 IBM? AIX? 計(jì)算機(jī)上已經(jīng)運(yùn)行了幾個(gè)月,沒(méi)有出現(xiàn)問(wèn)題。但是,在這個(gè)程序運(yùn)行時(shí),它每隔幾分鐘在同一個(gè)日志目錄中創(chuàng)建文件。文件名以 f.<number>e.<number> 開(kāi)頭。目錄越來(lái)越滿(mǎn),ls 命令的響應(yīng)時(shí)間顯著增加。這是可以理解的,因?yàn)槟夸浿械奈募嗔恕?/p>

        又過(guò)了幾個(gè)月,這個(gè) AIX 程序一直運(yùn)行,仍然沒(méi)有問(wèn)題。現(xiàn)在,有了 100,000 個(gè)以 f. 開(kāi)頭的文件和另外 100,000 個(gè)以 e. 開(kāi)頭的文件。現(xiàn)在,如果您試圖清理這個(gè)日志目錄,刪除以 f. 開(kāi)頭的文件,就會(huì)收到以下消息:

        # rm ~cormany/logs/f.*
        ksh: /usr/bin/rm: 0403-027 The parameter list is too long.

        我認(rèn)為您太久沒(méi)有清理文件了。但是,現(xiàn)在還不晚。

        在執(zhí)行 delete 等命令時(shí),會(huì)在執(zhí)行之前檢查和展開(kāi)所有參數(shù)。這個(gè)示例尋找 ~cormany/logs/f.*,這會(huì)展開(kāi)為 rm 命令的 100,000 個(gè)參數(shù)。換句話(huà)說(shuō),實(shí)際上執(zhí)行的并不是 rm ~cormany/logs/f.*,而是 rm ~cormany/logs/f.1 ~cormany/logs/f.2 ~cormany/logs/f.3 … ~cormany/logs/f.100000

        與其他 操作系統(tǒng)一樣,AIX 規(guī)定了可以使用的命令行參數(shù)和環(huán)境變量的長(zhǎng)度。在 AIX 中,可以使用 getconf 命令檢查這個(gè)值。在 getconf 手冊(cè)頁(yè)上,應(yīng)該會(huì)看到 ARG_MAX

        # man getconf
        …
          ARG_MAX
            Maximum length, in bytes, of the arguments for one of the exec 
            subroutines, including environment data.
        …
        # getconf ARG_MAX1048576

        這個(gè)值說(shuō)明對(duì)于環(huán)境變量和命令行參數(shù)可以使用 1,048,576 字節(jié)。看起來(lái)您已經(jīng)超過(guò)了這個(gè)上限。解決這個(gè)問(wèn)題有兩種方法:

        • 使用 smitty chgsys 并修改 ARG/ENV list size in 4K byte blocks 以提高這個(gè)值,或者使用 chdev 提高這個(gè)值。我不建議在每次遇到這類(lèi)錯(cuò)誤時(shí)為了圖方便修改系統(tǒng)范圍的參數(shù):這應(yīng)該是最后一招。

        • 不使用帶 100,000 個(gè)參數(shù)的 rm 命令(這會(huì)執(zhí)行失敗),而是使用 find 命令刪除文件,這會(huì)好得多:

          # find ~cormany/logs –name “f.*” –exec rm {} ;

          find 命令在目錄中搜索以 f. 開(kāi)頭的所有文件,而不是在 shell 命令行中放那么多參數(shù)。然后,find 命令對(duì)找到的每個(gè)文件執(zhí)行 rm,這樣就會(huì)刪除以 f. 開(kāi)頭的所有文件。



        結(jié)束語(yǔ)

        讀完本文之后,您應(yīng)該了解了這些常見(jiàn)問(wèn)題,知道如何快速地解決問(wèn)題。錯(cuò)誤可能看起來(lái)很簡(jiǎn)單,但是在 中您必須解決基本錯(cuò)誤,才能順利地前進(jìn)。愿您能夠順利地排除故障!


        linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)

        linux相關(guān)文章:linux教程




        關(guān)鍵詞: UNIX Linux Linux操作系統(tǒng)

        評(píng)論


        相關(guān)推薦

        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 静乐县| 朝阳区| 榆社县| 卢湾区| 德清县| 准格尔旗| 临城县| 新沂市| 洮南市| 龙岩市| 眉山市| 盐源县| 兴文县| 伊通| 中西区| 手机| 静宁县| 抚松县| 冀州市| 静乐县| 长葛市| 高邮市| 辛集市| 宁陕县| 中方县| 张家口市| 麻阳| 泰安市| 朝阳区| 长垣县| 额济纳旗| 上蔡县| 同仁县| 永嘉县| 自贡市| 昂仁县| 涞源县| 松滋市| 全州县| 成都市| 腾冲县|