dポイントプレゼントキャンペーン実施中!

こんにちは。
CGIから他のマシン上にシンボリックリンクを作る方法で困っています。
現在開発中のシステムは、フロントエンド用のマシンが複数(2台)あり、ロードバランサーにより、接続が切り替えられるようになっています。

つまり、同じURLアドレスにアクセスしても、どのマシンにつながるかはそのとき次第です。

このシステム上で、管理者メニューとして、Web上の項目を増やしたり減らしたりしたいのですが、その際に単なるファイルコピーやディレクトリの作成だけではなく、シンボリックリンクを作成したいのです。

同じマシン上であれば、パーミッションをそれなりに設定することで、CGIからでも、上記の操作が可能ですが、他のマシン(この場合、現在つながっていのいほうのもう1台のマシン)に対してはどのようにすればよいのでしょうか?

使えるプロトコルはsshとftpがあります。rcpやrloginは使えません。

sshを使えは、リモートマシンにシンボリックリンクを作成できるのですが、CGIから使用する方法がわかりません。シェルからであれば、暗号鍵を作ることにより、パスワードなしでのログインにも成功したのですが、CGIからだとユーザーが特殊なためにうまくいきません。

いっそ、CGIのLocationヘッダで飛ばすことも考えましたが、Basic認証を使っているために、パスワードを聞かれてしまい、その際にエスケープしてしまうと、処理が不完全になってしまいます。

なんとかsshでできないものかと調べてはいるのですが、いい情報がみつかりません。どなたか方法をご存知ないでしょうか。よろしくお願いします。

A 回答 (5件)

ローカルで実行してみましたが、ホームディレクトリを555にした状態でも


ログインを確認できましたよ?
ログイン先への鍵登録(authorized_keys)もしてありますよね?

1点嘘ついたかもしれません、鍵はwww-dataで作成してください。
よく考えたら、鍵の作成は本人でないとだめな気がしました^^;;
のこるは、ホストベース認証(.shosts)くらいしか思い浮かばないです。
# サーバ同士の接続ならホストベースもありかなと。。。

参考までに僕が実験したときの情報です。
$ pwd
/tmp/webuser1_ssh
$ ls -la
total 12
drwxr-xr-x 2 webuser1 wheel 512 Apr 14 22:33 .
drwxrwxrwt 8 root wheel 512 Apr 14 21:51 ..
-rw------- 1 webuser1 wheel 219 Apr 14 22:33 config
-r-------- 1 webuser1 wheel 1675 Apr 14 21:53 webuser1_rsa
-r--r--r-- 1 webuser1 wheel 409 Apr 14 21:53 webuser1_rsa.pub
-r--r--r-- 1 webuser1 webuser1 599 Apr 14 22:21 known_hosts.global
$ cat config
Host TEST
Hostname localhost
User sshuser1
IdentityFile /tmp/webuser1_ssh/webuser1_rsa
UserKnownHostsFile /tmp/webuser1_ssh/known_hosts.global
# GlobalKnownHostsFile /tmp/webuser1_ssh/known_hosts.global
BatchMode yes
$ ssh -F /tmp/webuser1_ssh/config TEST
----
$ ls -la ~
total 22
dr-xr-xr-x 2 webuser1 webuser1 512 Apr 14 22:23 . ← 555
drwxr-xr-x 4 root wheel 512 Mar 30 20:59 ..
-rw------- 1 webuser1 webuser1 2017 Apr 14 22:23 .bash_history
-rw-r--r-- 1 webuser1 webuser1 751 Mar 30 00:22 .cshrc
-rw-r--r-- 1 webuser1 webuser1 248 Mar 30 00:22 .login
-rw-r--r-- 1 webuser1 webuser1 158 Mar 30 00:22 .login_conf
-rw------- 1 webuser1 webuser1 373 Mar 30 00:22 .mail_aliases
-rw-r--r-- 1 webuser1 webuser1 331 Mar 30 00:22 .mailrc
-rw-r--r-- 1 webuser1 webuser1 766 Mar 30 00:22 .profile
-rw------- 1 webuser1 webuser1 276 Mar 30 00:22 .rhosts
-rw-r--r-- 1 webuser1 webuser1 975 Mar 30 00:22 .shrc
    • good
    • 0
この回答へのお礼

検証ありがとうございます。
相変わらず、
Could not create directory '/var/www/.ssh'.
とは出るものの、接続に成功しました。
以下、手順です。
スーパーユーザーで作業します。
# mkdir .ssh
# chown www-data:www-data .ssh
# chmod 700 .ssh
# sudo -u www-data ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/www/.ssh/id_rsa):/XXX/XXX..XXX/.ssh/id_rsa <-作ったディレクトリを指定
Enter passphrase (empty for no passphrase): <-パスフレーズは入力しない
Enter same passphrase again: <-同じく入力しない
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX www-data@xxxxxx
#vi .ssh/ssh_config
#cat .ssh/ssh_config
IdentityFile /XXX/XXX..XXX/.ssh/id_rsa
UserKnownHostsFile /XXX/XXX..XXX/.ssh/known_hosts
# id_rsa.pubをリモートマシンの~/.ssh/authorized_keysに追加
# sudo -u www-data ssh -F .ssh/ssh_config xxx@xxxx ls <-lsは適当
Could not create directory '/var/www/.ssh'.
The authenticity of host 'xxxx (xxx.xx.xx.xxx)' can't be established.
RSA key fingerprint is XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'XXXXX,XXX.XX.XX.XXX' (RSA) to the list of known hosts.
#
sudo -u www-dataでキーを作成することと、一回だけsudo -u www-dataでリモートマシンにログインするというのがキモのようですね。

エラーログにゴミが残るのがイマイチですが、まあよしとしましょう。
#リダイレクトすれば消せるんでしょうけど、本当のエラーが見えなくなっても困りますしね。

お礼日時:2009/04/16 15:40

ものすごく危険なことをしようとしている気がしないでもないですが


鍵を直接指定してみてはいかがですか?
詳しくは man sshで。
手順的にはこんな感じなるのではないだろうかと。。。

1. 接続用の鍵を作成する(ユーザは誰でもいい)
2. 同じく configファイルを作成する
3. 実行する ssh -F 作成したコンフィグファイル host 'コマンドライン'

configファイル で IdentityFile を指定するのがポイントかと
でも、やったことないので、本当にできるのかわかりません。
作成したファイルはwebから参照できないように注意してください。
もしかしたら、鍵の所有者はwww-dataにしてあげないとだめかもしれません。

この回答への補足

ありがとうございます。
試してみましたがだめでした。
IdentityFileを指定するほか、IdentitiesOnlyをyesにしたり、UserKnownHostsFileを指定してみたりもしたのですが、相変わらずerror_logには、
Could not create directory '/var/www/.ssh'.
と出続け、意地でも/var/www/.sshを作ろうとするようです。

補足日時:2009/04/13 11:45
    • good
    • 0

>www-dataは普通のユーザーではありませんので、ホームディレクトリがありません。

パスワードもわかりません。

rootになれるならその辺いくらでも変更できると思うのですが? ということです。
'/var/www/.ssh'を作ろうとしているということは、www-dataのホームディレクトリが/var/www/だからでしょう。いざとなればrootで鍵セットを作ってそこに置いておけば他のユーザと同じくパスワードなしのログインが可能なはずです。またはwww-dataのホームディレクトリを変更してしまうことも可能なはず。
さらにどちらもできないということなら、SuExecで任意のユーザでhttpdを動かすとか。
そう言うことを自由にできるのがrootユーザなわけですから、最初の質問が出たわけです。
    • good
    • 0

www-dataユーザがパスワードなしで相手マシンにログインできるようにすればいいのではないですか?


それでもエラーか何かがでてできないということでしょうか?
「ユーザーが特殊なため」の特殊とはどういう意味でしょうか。

この回答への補足

今知っているやりかたですと、ユーザーの~/.ssh/を必要とするのです。
www-dataは普通のユーザーではありませんので、ホームディレクトリがありません。パスワードもわかりません。
このため設定できない状態です。
認証キーファイルだけなら、-iオプションで設定できるようなので、これを設定してみてはいるのですが、apacheのエラーログを見ると、
Could not create directory '/var/www/.ssh'.
Host key verification failed.
と出ています。
CGIの環境変数を確認してみましたが、/var/www/を示しているものはなく、なぜ/var/www/.sshを作ろうとするのか不明です。これを作らせないようにすることができれば、うまくいきそうに思うのですが。

sshのオプションか、ssh_configで既存のディレクトリを設定できないものかと、いろいろ試しているのですが、どうにも設定てきない状態です。

あるいは、もっと他の方法がありますでしょうか?

補足日時:2009/04/10 16:50
    • good
    • 0

>CGIからだとユーザーが特殊なためにうまくいきません。



ということはroot権限でマシンを操作できないのでしょうか?
少なくともhttpdの権限になれるか、SuExecで自分の権限でhttpdが動いてくれるかでないとsshでの実現は難しいですが。
もしそうならサーバ管理者に相談するのが手っ取り早いです。

この回答への補足

>ということはroot権限でマシンを操作できないのでしょうか?
ユーザーを確認すると、www-dataとなっています。
root権限は取得できますが、root権限があったとして、どのような設定を行えばよいのでしょうか?

補足日時:2009/04/10 15:34
    • good
    • 0

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