カテゴリー:システム管理

質問

root権限でスクリプトを実行できない

回答

スクリプトの先頭行のパスや,改行コードが正しくない可能性があります。


難易度:★★★ 対象ディストリビューション:すべて

 正しく記述されたスクリプト・ファイルを実行しようとして,「許可がありません」(Permission denied)というメッセージが表示される場合は,実行権が適切に与えられていないか,パスが指定されていないことが原因です。

 実行権が与えられていない場合,

$ chmod +x sample.sh

として実行権を与えるか,あるいは,

$ . sample.sh

というように,「.」(または「source」)の後に半角スペースとスクリプト・ファイル名を指定して実行させるとよいでしょう。この「.」を付けることにより,コンソールとして起動しているシェルがsample.shスクリプトを解釈して実行します。

 また,カレント・ディレクトリに配置しているスクリプト・ファイルをファイル名のみで起動させようとしても起動しません*1。「./」のようにパスを指定して実行しましょう。

$ ./sample.sh

 実行できるようになりましたが,正しいスクリプトであるはずなのにエラーになることがあります。このような場合,次の2カ所を調べてみます。

 スクリプトでは,先頭に「#!」というマークの付いた行があります。これは,このスクリプトを実行するシェルやプログラムを指定している行です。例えば,「#!/usr/local/bin/perl」と書かれていたとします。多くのLinuxディストリビューションではperlのプログラムは/usr/binディレクトリ以下にあります。これではパスが異なっているため,実行できません。正しいパスに書き換えます。

 もう一つは改行コードの違いです。Windowsの改行コードは「CR」と「LF」の組み合わせです。一方,Linuxは「LF」です。改行コードの「CR」が改行コードとは認識されずに誤動作します。nkfコマンドなどで書き換えるとよいでしょう。

$ nkf -Lu W.pl > L.pl