同じフォルダ()でbashスクリプトを実行するa_web_page.cgi
開発ボックスでPerl CGIスクリプト()を実行したいと思います。.1.20
host_script.sh
その後、スクリプトは他のサーバーに対してSSHコマンドを実行します1.10
。このサーバーは単に文字列を返すスクリプトを実行します。
./host_script.sh
me
私がキーの所有者になる限り、script()を手動で実行すると機能します。 (キーはテスト目的でスクリプトと同じフォルダに保存されます。)
デフォルトでは、キーの所有者はですapache
。
問題は、apache
このキーを使用してもまだ機能しないことです。以下に説明しました。
このコマンドは.(開発ボックス)の仮想マシンで実行されます192.168.1.20
。ローカルボックスからSSHを介して仮想マシンに入りました。192.168.1.50
192.168.1.10
ターゲットコンピュータとscript1.sh
。スクリプトは文字列を返します。192.168.1.20
とを使用してApache Webサーバーを実行しているa_web_page.cgi
サーバーhost_script.sh
。 (私はこのボックスでこのコマンドを実行しています。)192.168.1.50
私のローカルコンピュータは実際に考慮してはいけませんが、役に立つ場合に備えてここに置いてください。
から192.168.1.20
:
ls - 卵
-rwxrwxrwx. 1 me apache 622 Apr 12 09:19 a_web_page.cgi
-rwxrwxrwx. 1 me apache 111 Apr 11 15:14 host_script.sh
-rwx------. 1 apache apache 1675 Apr 11 15:11 test
-rwx------. 1 apache apache 392 Apr 11 15:11 test.pub
vim ホスト script.sh
#!/bin/bash
ssh -i /var/www/html/dev/remote_script/test [email protected] "/home/user/scripts/script1.sh"
a_web_page.cgi
#!/usr/bin/perl
use strict;
use warnings;
print "Content-type: text/html\n\n";
my $executeString = './host_script.sh';
my $output = `$executeString`;
print "<br />$executeString<br />: $output<br />";
出力(http://192.168.1.20/dev/remote_script/a_web_page.cgi):
./host_script.sh
:
sudo tail -f /var/log/httpd/error_log
[Tue Apr 12 10:05:22 2016] [error] [client 192.168.1.50] ssh: connect to host 192.168.1.10 port 22: Permission denied\r
(クライアントIPが開発ボックスではなく私のローカルボックスである理由は混乱しています。)
設定されている場合
inet addr:192.168.1.20
(SSHセッションを終了してローカルコンピュータでifconfigを実行した場合。192.168.1.50
)
この段階でSSHが失敗することがわかるので、自分で実行する権限を与えて192.168.1.10
実行してみましょう。host_script.sh
sudo chown me テスト
これはうまくいきます。
./host_script.sh
This is a script on the 192.168.1.10 server!
(この文字列はscript1.sh
onから返され、1.10
単にechoステートメントです。)
したがって、キーを読み取る権限がある限り、スクリプトを直接実行しても問題はありません。
-rwx------. 1 me apache 1675 Apr 11 15:11 test
-rwx------. 1 me apache 392 Apr 11 15:11 test.pub
ベストアンサー1
sshコマンドを手動で実行するときにパスワードなしのSSHを設定し、~user/.sshに必要なキーがあるとします。 Webページを介してこのプログラムを実行すると、ユーザーapache(またはユーザーhttpd)でsshが実行され、キーは〜apache / .sshが使用されます。ユーザーにパスワードのないSSHがないため、「権限が拒否されました」。
192.168.1.50でWebページを表示しているため、error.logに示すようにssh(192.168.1.20で実行中)が192.168.1.10に接続できないというエラーが発生します。これは正しいです。
この問題を解決するさまざまな方法:
- apacheが自分のユーザーとしてsshを実行できるように、apacheにsudoアクセスを許可します。 "sudo -u me -c 'ssh 192.168.1.10 'script1.sh'"のようにすると、apacheはsudoを使用して切り替えます。あなたにsshを実行しなさい。
- Apacheに両方のホストにホームディレクトリを持たせ、Apacheユーザー用のパスワードなしのSSHを設定し、すべての操作をApacheとして実行します。
セキュリティ上の問題が懸念される場合は、Webサービスなどの代替ソリューションを見つける必要があります。