はじめての親子ハイキングに挑戦!! >>

はじめまして。
プロキシサーバの閲覧許可サイトを変更するCGIを作っています。
許可サイトのリストを更新して、
my $res=system("/etc/rc.d/init.d/squid restart");
または、sudoersの設定も可能なので、
my $res=system("sudo /etc/rc.d/init.d/squid restart");
を実行したいのですが、方法が分かりません。
どなたか、実行方法を教えてください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

具体的に対処する部分だけを抜き出すと


エラーメッセージ:
Insecure $ENV{PATH} while running setuid at perl_script.cgi line 43.

こんなエラーが出たときには、↓これを書きます。

$ENV{PATH} = '/bin:/usr/bin';

エラーメッセージ:
Insecure dependency in `` while running with -T switch at perl_script.cgi line 53.

それでもこんなエラーが出たときには、例えばsystemの中で実行しているコマンドを

system "/bin/rm"," -f ", $file;

こんな風に分けて書いたら実行できました。
参考URLには別の方法(正規表現で値をチェック)が書いてあります。私がやった方法はごまかしになるので、参考URLの方法の方がよさそうです。
私は実際こんな方法でやったのですが、「PerlのTaintモード」のことについてはよく理解しているわけではないので解説はできません。
それとapacheのsuExecの方は試したことがないので説明できませんが、こちらの方がたぶん検索していろいろ解説をみつけられると思います。もちろん、apacheを使っていないのでしたらだめですが。

それとこれは、suidperlを使って上記のようなエラーがでた場合の対処法で、すんなり実行できるのでしたらする必要はありません。

この回答への補足

返事が遅くなってすみません。
問題続発で、期限が今月中のこの問題が後回しになってしまいました。
最終的には解決が必要な事なので、時々作業してはいました。
結論から言うと、sudoersを変更する事で、当初の問題は解決しました。

結果的には、今回はsuidperlを使いませんでしたが、whitiaさんのアドバイスで出来た所までの事を報告します。

まず、参考URLなどを参考に、suidperlをインストールしました。
yum install perl-suidperl

----who.cgi(ここから)------
#!/usr/bin/perl
print "Content-type: text/html\n\n";
printf "I am %s.<br>\n",(getpwuid($>))[0];
----who.cgi(ここまで)------

[実行結果]
chmod 755 who.cgi
の場合
I am apache.

chmod 4755 who.cgi
の場合
I am [ユーザ名].

chmod 4755 who.cgi
chown root who.cgi
の場合
I am root.

この結果から、rootの権限が取得できたと考え、ほぼ成功を確信しました。
それで、下のようなプログラムを作りました。

----test.cgi(ここから)------
#!/usr/bin/perl
print "Content-type: text/html\n\n";
printf "I am %s.<br>\n",(getpwuid($>))[0];
print "restart proxy...";
$res=system("/etc/rc.d/init.d/squid","restart");
if($res==0){
print "ok<br>\n";
}else{
print "ng<br>\n";
}
----test.cgi(ここまで)------

[実行結果]
I am root.
restart proxy...

表示すべき文字(エラーの場合のng)を表示せずに、アドバイスにあったエラー表示もないし、なすすべない状態でした。
で、色々試している時に、ふとユーザーでログインして試してみました。

[実行結果]
I am root.<br>
Insecure $ENV{PATH} while running setuid at ./test.cgi line 6.
restart proxy...

この時、whitiaさんの回答にあったメッセージが出たので、これで解決かと思って、
$ENV{PATH} = '/bin:/usr/bin';
を追加。

[実行結果]
Content-type: text/html

I am root.<br>
restart proxy...sed: /etc/squid/squid.confを読み込めません: 許可がありません
squid を停止中: /etc/rc.d/init.d/squid: line 84: /var/log/squid/squid.out: 許可がありません
[失敗]
init_cache_dir /var/spool/squid... /etc/rc.d/init.d/squid: line 57: /var/log/squid/squid.out: 許可がありません
squid を起動中: /etc/rc.d/init.d/squid: line 61: /var/log/squid/squid.out: 許可がありません
[失敗]
ng<br>


そこで、
chmod 666 /etc/squid/squid.conf
chmod 777 /var/log/squid

[実行結果]
I am root.<br>
restart proxy...squid を停止中: 2006/06/19 09:02:28| ALERT: setgid: (1) Operation not permitted
squid: ERROR: Could not send signal 15 to process 4393: (1) Operation not permitted
rm: cannot remove `/var/lock/subsys/squid': 許可がありません
...........................................ng<br>
.(ドット)が出続けたので、途中で止めたら、ng<br>を表示。

ここまでくると、あまりシステムのパーミッションを書き換えるのもどうかと思ってしまいました。
以上が出来た事と、出来なかった事をまとめた物です。
実際は試行錯誤しながら途切れ途切れにわかった事です。

whitiaさんにはお世話になりました、ありがとうございました。

補足日時:2006/06/22 06:31
    • good
    • 0
この回答へのお礼

今回は解決のタイムリミットの時間があったため(他の問題に比べて)、後回しになって、結果報告が遅くなってすみませんでした。
今回は結果的にはsuidperlを使いませんでしたが、色々勉強になりました。

>system "/bin/rm"," -f ", $file;
>こんな風に分けて書いたら実行できました。
これは参考になりました。

whitiaさん、ありがとうございました。
これからも何かあったらよろしくお願いします。

お礼日時:2006/06/22 06:49

suidperl、sperlを使うか、


apacheのsuExecを使うか等の方法があると思います。

方法についての参考)
http://www.tohoho-web.com/lng/r200006/00060081.htm

suidperlを使う場合は、CGIスクリプトファイルのパーミッションを4755にします。

chmod 4755 perl_script.cgi

suidperlはスクリプトをファイルオーナーのUIDで実行するので、root権限で動かしたい場合はそのファイルのオーナーをrootにします。
またsystem関数を使う場合などはセキュリティの問題でエラーがでると思うので、以下のURLを参考にしてみてください。

http://www.ipa.go.jp/security/awareness/vendor/p …

http://www.kt.rim.or.jp/~kbk/perl5.005/perlsec.h …
    • good
    • 0
この回答へのお礼

ありがとうございます、whitiaさん。
suidperl、sperl、suExecなどで試してみます。

先ほどから参考URLを見ていますが、いまひとつ理解しきれていませんが、がんばってみます。

お礼日時:2006/06/08 07:32

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QHTML上(javascript)からCGIを実行する方法

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTMLファイルの一部にcgi処理結果を表示させたいものです。

そもそも、SSIを使用しなければ下記のようなHTML内にcgiなどの
実行結果を表示する事は出来ないのでしょうか。
よろしくお願い致します。

※下例のプログラムではcgi結果は表示されませんでした・・・。

---<index.htm>----------------------------------------
<HTML>
<BODY>
<SCRIPT language="Javascript" src="http://xxx.xxx.xxx.xxx/test.cgi"></SCRIPT>
</BODY>
</HTML>

---<test.cgi>----------------------------------------
#!/usr/bin/perl

print "test"

javascriptから外部実行ファイル(javascriptファイルではなくperlなどのCGI)
を実行する方法を探しています。
下記のようにindex.htmとtest.cgiファイルを用意して、index.htm内の
javascriptから外部cgiを実行させ、cgiの結果(test.cgiでは単に
『test』と表示するのみ)を表示したいと考えています。

利用増ですが、cgiやssiが使用できないサーバにindex.htmを置いて、
cgiが使用できるサーバ上のcgi結果を取得したいものです。
通常のcgiのように、1ページでcgi結果を表示するものではなく、
HTML...続きを読む

Aベストアンサー

「Google AdSense」のjavascriptでは#1さんの回答にもありますがiframeを使用するような仕掛けになっているようです。
・javascriptでiframeを展開。
・iframeのsrcでcgiを指定。

>外部cgiでjavascriptを生成する仕組みを作り、その生成されたjavascriptを参照するという間接的な仕組みを設ければ可能になる
そういう仕組みも可能です。
また、直接的に<script type="text/javascript" src="xxxx.cgi"></script>
こういう書き方も可能です。
※xxxx.cgiでは処理結果をjavascriptのコードとして
print "Content-Type: application/x-javascript\n\n";
print "document.write('xxxx');";
みたいにして吐き出す必要があります。

Qシェルでsyntax errorがでてしまう

温度管理をするため、CentOS4.4上で下記のようなスクリプトを動かしています。

---スクリプト始まり---
#!/bin/bash
date=$(date '+%Y/%m/%d(%a)/%R')
rh=$(/var/usbrh/usbrh -1 2>&1)
limit=35
rh_judge=$(echo $rh | cut -c14-15)
if (( ${rh_judge} >= ${limit} )) ;then
alert=alert
else
unset alert
fi
echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log
---スクリプト終わり---
このスクリプトで、ログを出力し、limit以上の数値になった場合、alertがログに書き込まれるようにできました。
そこでコレを少し改良してalert時にメールを飛ばせる様にしたいと思い下記のようにif文を差し替えました。

---if文始まり---
if (( ${rh_judge} >= ${limit} )) ;then
alert=alert
address="xxx@hogehoge.com"
subject="TemperatureAlert"

mail -s $subject $address << END
`$rh`
END
else
unset alert
fi
---if文終わり---

ところが、
echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log
のあとの行(line23)で
line 23: syntax error: unexpected end of fileというのが出て
スクリプトが動かなくなってしまいました。

ログの書き込み部分は問題ないと思うのですが、原因がわかる方いらっしゃいますでしょうか。
ご指摘頂ければ幸いです。
宜しくお願いいたします。

温度管理をするため、CentOS4.4上で下記のようなスクリプトを動かしています。

---スクリプト始まり---
#!/bin/bash
date=$(date '+%Y/%m/%d(%a)/%R')
rh=$(/var/usbrh/usbrh -1 2>&1)
limit=35
rh_judge=$(echo $rh | cut -c14-15)
if (( ${rh_judge} >= ${limit} )) ;then
alert=alert
else
unset alert
fi
echo ${date} ${rh} ${alert} >> /var/usbrh/usbrh_tes2.log
---スクリプト終わり---
このスクリプトで、ログを出力し、limit以上の数値になった場合、alertがログに書き込まれるように...続きを読む

Aベストアンサー

気になるのは `$rh` かなぁ?
$rh に入っている文字列を, コマンドとして実行したいの? もしそうだとしても,
$rh | mail ...
の方が素直じゃないかなぁ.
あと, ヒアドキュメントを終わらせる END の前後に空白がないことも確認してください.

Qapacheユーザの実行権限設定はどうすれば良い?

■環境
・Cent OS

■状況
・所有者hogeのディレクトリxに対して、スクリプト経由(apacheユーザ権限)でchmodしようとすると、エラーになります
・スクリプト経由(apacheユーザ権限)でディレクトリ作成しようとしても、エラーになります

■質問
・どうすれば良いでしょうか?
・所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

・ディレクトリ所有者がhogeであることが問題? apache所有にした方が良い?
・それとも、スクリプト実行を、apacheユーザ権限ではなく、所有者hogeにした方が良い? どうやって?

・そもそもapacheユーザ権限は、一般的にどう設定するものなのでしょうか? rootみたいに最強にする?

Aベストアンサー

> 所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

基本的にはそれでOKですが、それだけではapacheユーザが作成した
ファイルをhogeユーザが変更できなくなってしまうかもしれません。

user=hoge,group=hoge
user=apache,group=apache,groups=hoge

groupは一次グループ、groups2は二次グループです。umask002 (新
規作成されたファイルのパーミッションが775 ) に設定されている
とします。

hogeユーザが作成したファイルはhoge/hoge なので、hogeグループ
に属するapacheユーザは編集可能です。しかし、apacheユーザが新
規作成したファイルはapache/apache になるので、apacheグループ
に属さないhogeユーザは編集できません。

そこで、ディレクトリをhogeユーザで作成し、ディレクトリにsgid
ビットを立てます。

$ chmod 2775 dir
$ ls -l dir
drwxrwsr-x 2 hoge hoge 4096 4月 7 13:35 dir

これで、apacheユーザがdir上に作成したファイルはapache/apache
ではなく、apache/hoge になるので、hogeユーザも編集できるよう
になります。

> 所有者hogeのグループにapacheユーザを入れたら効果あるでしょうか?

基本的にはそれでOKですが、それだけではapacheユーザが作成した
ファイルをhogeユーザが変更できなくなってしまうかもしれません。

user=hoge,group=hoge
user=apache,group=apache,groups=hoge

groupは一次グループ、groups2は二次グループです。umask002 (新
規作成されたファイルのパーミッションが775 ) に設定されている
とします。

hogeユーザが作成したファイルはhoge/hoge なので、hogeグループ
に属するapacheユーザは編集可能...続きを読む

Qfetchrow_arrayとfetchrow_hashrefの使い方

Jやまとです。
PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。
(1)fetchrow_array使用
(2)fetchrow_hashref使用
以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。
原因が全く分かりません。
分かる方いらしゃいましたら、ご教授願います。
OS:TurboLinux6.2
DB:Oracle8i
Apache,PerlはTurboLinux6.2に入っているものをそのまま使用
以下、ソースを記載します。
---------------
(1)fetchrow_arrayを使用して行の値を取得(こっちは動く)
$dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr);
$sql = "SELECT SYSDATE FROM DUAL \n";
$sth = $dbh->prepare( $sql );
$sth->execute or die "Cannot execute. " . $sth->errstr();
$cnt1 =1;
while (@row = $sth->fetchrow_array()) {
@{$get_date[$cnt1]} = @row;
$cnt1++;
}
---------------
(2)fetchrow_hashrefを使用して行の値を取得(こっちが動かない)
$dbh = DBI->connect($ds, $user, $pass) || &dbErr("Database can't connect." . $DBI::errstr);
$query = qq{
SELECT SYSDATE FROM DUAL
};
$sth = dbh->prepare($query);
$sth->execute(); # 実行
if($sth->rows() != 1){ # 該当する行数
# エラー処理
}
$rhash = $sth->fetchrow_hashref();
%hash = {%{$rhash}};
$sth->finish();
$get_date = $hash{SYSDATE};
---------------
(2)実行時のerror_log
Can't locate object method "prepare" via package "dbh" at /u01/ora1/www/htdocs/hoge.cgi line 30.
Premature end of script headers: /u01/ora1/www/htdocs/hoge.cgi
---------------
(本文長くてすみません)

Jやまとです。
PerlからSELECT文を実行して結果の行の値を取得する単純なスクリプトを作成しています。
(1)fetchrow_array使用
(2)fetchrow_hashref使用
以上2通りの方法で試したのですが、(2)がInternal Server Errorになります。
原因が全く分かりません。
分かる方いらしゃいましたら、ご教授願います。
OS:TurboLinux6.2
DB:Oracle8i
Apache,PerlはTurboLinux6.2に入っているものをそのまま使用
以下、ソースを記載します。
---------------
(1)fetchrow_arrayを使用して行の値を取得(こっちは...続きを読む

Aベストアンサー

rowsメソッドと同じく、executeが正しく処理レコード数を返すのは、非select文を実行した場合のみです。
select文の場合、rowsもexecuteも0行と認識するDBDが多いです。
で、これはselect文に限らずですが、処理レコード数が0の場合は、0自体ではなく「0E0」を返します。
これは、0を返すと、実行エラー時の戻り値undefと同様、
if ($sth->execute) {} で失敗したのと同じことになってしまうためです。
select文の行数は、fetchしながら行数をカウントするか、取り込んだ、配列、ハッシュの数をカウントするのが一般的な方法ですね。fetchする前に取得する方法はわかりません。

QNTPで同期が始まらない

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntpq -pの結果は下記となります。

remote refid st t when poll reach delay offset jitter
==============================================================================
133.100.9.2 .INIT. 16 u - 64 0 0.000 0.000 4000.00
130.69.251.23 .GPS. 1 u 27 64 377 8.015 -99970. 17262.6

同期ができれば「remote」列に「*」が表示されると思っています。
何か設定が足りないでしょうか?。
尚、「/vat/log/message」をtailしてますが特にエラーは無さそうです。

よろしくお願いします。

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntp...続きを読む

Aベストアンサー

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハードウエアclockを合わせます。
http://www.linux.or.jp/JM/html/util-linux/man8/hwclock.8.html

○ntpdの動作
ntpによる時刻調整は、調整幅が通常128mSと小さいので、1時間は様子をましょう。
2時間程度経過しても、時刻修正の兆候が見られない場合ハードウェアの不良も考えられます。

時刻調整の兆候としては、
・logファイルに 一時間毎に調整したメッセージが書かれる。
Jan 7 21:57:40 ntpd[91145]: offset 0.000994 sec freq -190.802 ppm error 0.000076 poll 8
・ntpq -p の出力の最初の桁に"*,+"が付く。また、reach が377になる。
% ntpq -np
remote refid st t when poll reach delay offset jitter
+192.168.0.102 GPS_NMEA(0) 2 u 3 32 377 0.926 -0.330 0.023
*192.168.0.192 GPS_NMEA(1) 2 u 10 32 377 0.747 -0.336 0.023
192.168.0.9 PPS(1) 2 u 3 32 377 0.757 6.559 0.161


○その他
・PC起動時には、システムクロックを計測してその後の動作の基準にしていますが、
CMOSバッテリ不足やハードウェアに何らかの異常があるととんでもない時刻を示すことがあります。(要修理です)
・BIOSの時計も起動時の初期時刻として使われてしまうので、ある程度合わせておいた方がいいです。

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハ...続きを読む

QCGIから外部コマンド実行時の標準出力の取得方法について

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
systemの場合はちゃんと動作します。

■実際にやりたいこと
oracleサーバへの問い合わせ結果を取得したいのですが、
10gのクライアントまでは入りましたが、perlのDBD::Oracleがうまく入らなかったため、sqlplusで処理しようと考えています。
最初は直接CGIから呼び出そうとしたのですが、sudo時に環境変数が設定されないので、bashのシェルスクリプトにexportで先頭に書いております。
外部公開サーバではありませんので、とりあえずセキュリティーは無視しています。

systemで実行結果をcgiの標準入力に渡すか、バッククォートでエラーが出なくするかどちらかの方法はありませんでしょうか?

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
sys...続きを読む

Aベストアンサー

open(IN,"|sudo -u USER PROGRAM");
は、前にパイプがあるので標準入力を受け付けています。

標準出力を取得するには、
open(IN,"sudo -u USER PROGRAM|");
後ろにパイプをつけてください。
そして、 print while(<IN>);

Q【MTA】postfixとsendmail【違い】

はじめまして。シアトルでシスアド見習いをしている者です。

今日みなさんにお聞きしたいのは、postfixとsendmailMTAの違いについてです。

いろいろな記事で比較されておりましたが、Google先生に聞いたところ
・sendmailは設定が複雑だけど未知のプロトコルにも対応している
・postfixは設定は簡単、MailDir構造を使用していて、SMTPプロトコルに特化
のような内容が沢山出てきました。

また、itmedia様の過去ログにて
・sendmailは送受信共にsendmailにて可能
・postfixは受信は受けるが、送信は外部MDA(?)
のような違いがあるとも書いてありました。

しかしながら、動作的にこれら二つのMTAが具体的にどう変わるのかについての説明がなされている記事が見当たらず、ここで質問させていただいた次第でございます。

内容としましては現在、システムが使用するMTAとして、現在postfixとsendmailがサーバーに入っております。
システムが使うMTAの設定は

/etc/alternatives/mta -> /etc/alternatives/sendmail.sendmail

となっています。
またMTAの候補は以下の二つです。

/etc/alternatives/sendmail.sendmail
/etc/alternatives/sendmail.postfix

そこで質問なのですがこのmtaのリンクをsendmail.sendmail -> sendmail.postfixに変更した場合、何か具体的に動作の違いは出てくるのでしょうか?

よろしくお願いいたします。

はじめまして。シアトルでシスアド見習いをしている者です。

今日みなさんにお聞きしたいのは、postfixとsendmailMTAの違いについてです。

いろいろな記事で比較されておりましたが、Google先生に聞いたところ
・sendmailは設定が複雑だけど未知のプロトコルにも対応している
・postfixは設定は簡単、MailDir構造を使用していて、SMTPプロトコルに特化
のような内容が沢山出てきました。

また、itmedia様の過去ログにて
・sendmailは送受信共にsendmailにて可能
・postfixは受信は受けるが、送信は外部MDA(?...続きを読む

Aベストアンサー

どちらもデフォルトの状態であればローカル配送のみでしょうから、SMTPとしての表面的な動作にそれほど違いはありません。

altanativesして不都合が生じるとしたら、コマンドベースのsendmailのリンクが張り替えられてオプションに違いがでてくるので、それを呼び出してるプログラム(CGIなど)がネイティブsendmail固有のオプションを付加している場合はエラーになるってくらいですかね。


まあそれはあくまでも表面的な動作としてであってです。内部的にはたくさん違いがありますよ。
SMTPサーバとして稼働済みのSendmailをPostfixに置き換えようとしているのだとしたら、話はもっとややこしくなると思います。

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qシェルスクリプト内で他のサーバへSSH接続

急にシェルスクリプトを組む事になり、勉強を始めて2週間です。
下記について、調べても分からなかった為、教えてください。

どのようなコマンドを使用すればよいのかや、参考になるサイトがありましたら教えてください。

【概要】
シェルスクリプト内で、SSH接続で他サーバへ接続し他サーバ内で別のシェルスクリプトを実行する。その際にroot権限が必要となる。

【環境】
作業PC:Windows
サーバA:Linux
サーバB:Linux

【スクリプト】
スクリプト1
 格納場所:サーバA
 処理  :スクリプト1、2を実行
スクリプト2
 格納場所:サーバA
 処理  :サーバA内でディレクトリ作成等の作業をしてOK/NGを返却
スクリプト3
 格納場所:サーバB
 処理  :サーバB内でディレクトリ作成等の作業をしてOK/NGを返却

【やりたい事】
1.作業PCからサーバAへSSH接続
2.サーバAでroot権限へスイッチし、スクリプト1を実行
3.スクリプト1は、スクリプト2を実行
4.スクリプト2はディレクトリ作成等の処理を行い、OK/NGを表示
5.スクリプト1は、サーバBへSSH接続
6.スクリプト1は、サーバBでルート権限へスイッチし、スクリプト3を実行
7.スクリプト3はディレクトリ作成等の処理を行い、OK/NGを表示
8.スクリプト1はサーバBからログアウト

急にシェルスクリプトを組む事になり、勉強を始めて2週間です。
下記について、調べても分からなかった為、教えてください。

どのようなコマンドを使用すればよいのかや、参考になるサイトがありましたら教えてください。

【概要】
シェルスクリプト内で、SSH接続で他サーバへ接続し他サーバ内で別のシェルスクリプトを実行する。その際にroot権限が必要となる。

【環境】
作業PC:Windows
サーバA:Linux
サーバB:Linux

【スクリプト】
スクリプト1
 格納場所:サーバA
 処理  :スクリプト1、2を実...続きを読む

Aベストアンサー

普通にsshでできるはずですが?サーバーA、サーバーBともにopensshはインストールしてありますよね?もし、インストールしていない場合、「Linux openssh インストール」などで検索してみましょう。

sshのマニュアルで、引数に[command]とあるのを見たことありませんか?
http://www.openbsd.org/cgi-bin/man.cgi?query=ssh&sektion=1

これは、例えば次のコマンドを実行すると、user0としてログインした上でlsを実行します。
$ ssh user0@host ls

同様にscript3.shをroot権限で実行するなら、次で良いでしょう。
$ ssh root@host /where/you/put/script3.sh

ただ、root権限でのログインをするにはサーバーBにてroot権限でのログインを可能とするよう設定を変更する必要があります。
/etc/sshなどにあるsshd_configを編集し、PermitRootLoginを設定してください。
http://www.openbsd.org/cgi-bin/man.cgi?query=sshd_config&sektion=5

サーバーBのルート権限が奪取されてもあまり気にしないならここでPermitRootLogin yesとしても良いかもしれませんが、おっしゃるような用途で使う場合、PermitRootLogin forced-commands-onlyと設定するのが普通です。

この作業をするためには当然、ssh-keygenでログインするときに使う公開鍵を作っておき、サーバーBの~root/.ssh/authorized_keysに置いてあると思います。(何を言っているのかわからないなら、「ssh 公開鍵 使い方」などで検索してみてください。)このauthorized_keysで、ログインに使用する公開鍵の前にcommand="/where/you/put/script3.sh"を書いておくと、その公開鍵を使ったログインではscript3.shしか実行できなくなり、より安全です。
http://chihungchan.blogspot.jp/2008/08/restrict-ssh-to-run-specific-command.html

あと、これも参考になるかもしれません。
http://oreilly.com/catalog/sshtdg/chapter/ch08.html

頑張って。

普通にsshでできるはずですが?サーバーA、サーバーBともにopensshはインストールしてありますよね?もし、インストールしていない場合、「Linux openssh インストール」などで検索してみましょう。

sshのマニュアルで、引数に[command]とあるのを見たことありませんか?
http://www.openbsd.org/cgi-bin/man.cgi?query=ssh&sektion=1

これは、例えば次のコマンドを実行すると、user0としてログインした上でlsを実行します。
$ ssh user0@host ls

同様にscript3.shをroot権限で実行するなら、次で良いでしょう...続きを読む


人気Q&Aランキング