|
>>2334 わたなべ での書き込みにある、>>2322は>>2332の間違いです。 重ねてお詫びします。申し訳ありません。 |
|
>>2334 わたなべ > ひょっとして、これもまずい行動でしたか。 問題ありません。書いてある通り、covered by the BSD-Licence です。 checkout できるファイルとできないファイルがあるということですから、 まずはリポジトリのパーミッションはどうなっているか確認して下さい。 同じディレクトリでも co できるファイルと co できないファイルがあれば、 ファイルのパーミッションが怪しいですし、あるディレクトリの下のファイルが 全て co できないならディレクトリのパーミッションがおかしいでしょうし。 うちの Solaris2.6 では % chown -R cvs /cvsroot (グループは cvs グループで統一) % chmod -R g+w /cvsroot (cvs グループに書き込み権限を与える) % find /cvsroot -type d | xargs chmod g+s (BSD タイプのパーミッションに) とかしてます。でも、cvsweb.cgi は nobody で動かしているから これは関係ないかな…。 また、CGI の実行権限は何ですか? 例えば nobody なら su nobody して から checkout してみて下さい。 実際にどういうコマンドが実行されているかは、 if (! open($fh, "-|")) { # child open(STDERR, ">&STDOUT"); # Redirect stderr to stdout exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where); } の前に print "Content-type: text/plain\n\n"; print qq(exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);); exit; などと書けばわかるでしょう。 それでもダメなら exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where); を exec("/bin/truss", $CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where); として、どのファイルをオープンしようとしてエラーになっているかを 調べて下さい。ちなみに、こちらでやってみると open("/MASTER/cvs/CVSROOT/config", O_RDONLY) = 4 open("/MASTER/cvs/CVSROOT/cvsignore", O_RDONLY) Err#2 ENOENT open("//.cvsignore", O_RDONLY) Err#2 ENOENT open("/MASTER/cvs/CVSROOT/cvswrappers", O_RDONLY) = 4 open("/MASTER/cvs/CVSROOT/modules", O_RDONLY) = 4 .. open("/MASTER/cvs/admin/public_html/cvsweb.cgi,v", O_RDONLY) = 5 となります。 |
|
特定の一般ユーザをroot権限と同様な権限を与えたいのですが、 設定方法を教えてもらえないでしょうか。 /etc/groupのファイルのrootグループに追加するだけで はいけないのでしょうか。 |
|
度々すいません。 >>2336 68user >同じディレクトリでも co できるファイルと co できないファイルがあれば、 >ファイルのパーミッションが怪しいですし、あるディレクトリの下のファイルが >全て co できないならディレクトリのパーミッションがおかしいでしょうし。 リポジトリのパーミションを確認しました。 $CVSROOTディレクトリは 755 その中のプロジェクト毎のディレクトリは 775 でした。 各プロジェクト毎のディレクトリ内にある、サブディレクトリは 775 そして、ファイルは全て 444 でした。 チェックアウト出来るファイル/出来ないファイル、全て同一のパーミションで、同一のディレクトリ内にあるファイルでもチェックアウト出来るものと出来ないものがありました。 >また、CGI の実行権限は何ですか? >例えば nobody なら su nobody してから checkout してみて下さい。CGI は nobody で動いています。 su nobody をやってみたのですが、パスワードを求められました。 僕はこのサーバの管理者ではないので nobody にはなれない様な気がしているのですが、可能なのでしょうか? >実際にどういうコマンドが実行されているかは、 これは最初に書き込みをした時点でやってみました。 CGI からではなく、ターミナル上のコマンドからならチェックアウト出来ることも確認しております。 >exec("/bin/truss", $CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where); やってみたところ、以下の様な出力を得ました = From ======================================== cvs checkout: cannot exec co: No such file or directory cvs checkout: could not check out xxx/yyy/Zzz.java waitid(P_PID, 17464, 0xFFBEF1C0, WEXITED|WTRAPPED|WNOWAIT) = 0 ioctl(0, TIOCGPGRP, 0xFFBEF17C) Err#22 EINVAL getpgid(17464) = 350 ioctl(0, TIOCGPGRP, 0xFFBEF17C) Err#22 EINVAL waitid(P_PID, 17464, 0xFFBEF1C0, WEXITED|WTRAPPED) = 0 waitid(P_ALL, 0, 0xFFBEF160, WEXITED|WTRAPPED|WNOHANG) = 0 fork() = 17467 waitid(P_PID, 17467, 0xFFBEF270, WEXITED|WTRAPPED|WNOWAIT) = 0 ioctl(0, TIOCGPGRP, 0xFFBEF22C) Err#22 EINVAL getpgid(17467) = 350 ioctl(0, TIOCGPGRP, 0xFFBEF22C) Err#22 EINVAL waitid(P_PID, 17467, 0xFFBEF270, WEXITED|WTRAPPED) = 0 waitid(P_ALL, 0, 0xFFBEF210, WEXITED|WTRAPPED|WNOHANG) = 0 llseek(0, 0, SEEK_CUR) Err#29 ESPIPE _exit(0) = End ========================================= 上のメッセージの3行目以降は、チェックアウト出来たファイル/出来なかったファイル共に出力されていました。 現状報告だけで申し訳ありません。 このページで学んだ通り、ユーザ権限で CGI を動かすようにもしてみたのですが、それでも何も状況は変わりませんでした。 |
|
>>2338 わたなべ の >例えば nobody なら su nobody してから checkout してみて下さい。CGI は nobody で動いています。 は >例えば nobody なら su nobody してから checkout してみて下さい。 CGI は nobody で動いています。 と訂正させてください。 毎度毎度申し訳ありません。 |
|
>>2332 わたなべ > cvs checkout: cannot exec co: No such file or directory ん〜、これってもしかして、単に co(1) が見付からないって 言ってるのかな? co(1) にパスは通ってます? # って、どういうときに co(1) が使われるのかいまいちわかってませんが。 ## これが原因なら、かなり的外れなことを言ってたことになるなぁ。 |
|
>>2340 68user >ん〜、これってもしかして、単に co(1) が見付からないって >言ってるのかな? co(1) にパスは通ってます? co(1) という書き方が何を指すのか、わからないのですが、 which co で得られるパスを、 cvsweb.conf の $command_path にコロンでつなげて 記述すればいいんですよね? 一応それはやってあります。 CVS も RCS も、root が入れたものではなく、ユーザ権限でインストール したもので、それらをユーザの ~foo/cgi-bin/cvsweb/ で使おうと しているのですが、その辺りに問題があったりしますか? |
|
>>2338 わたなべ > which co で得られるパスを、 cvsweb.conf の $command_path にコロンで > つなげて記述すればいいんですよね? はい、そうです。 > リポジトリのパーミションを確認しました。 ではリポジトリのパーミッションは問題ないでしょう。 > 僕はこのサーバの管理者ではないので nobody にはなれない様な気が > しているのですが、可能なのでしょうか? 一度 root にならないと nobody にはなれません。 truss の結果 (システムコールでこけているわけではないらしい) と、 > cvs checkout: cannot exec co: No such file or directory > cvs checkout: could not check out xxx/yyy/Zzz.java のメッセージから、単に PATH を検索して、co が見付からないので co -r1.1 /cvsroot/xxx/yyy/Zzz.java,v がこけているのかと思ったのですが、違うのかなぁ。成功するファイルと 失敗するファイルがあるというのが謎ですが…。 でも、最近の cvs (少なくとも cvs-1.11) では rcs (co も含む) は 使っていないはずなので違うかなぁ (cvs は rcs を使わないけど、 cvsweb は rcs を使う)。 …と書いたところで今気づきましたけど、 > CVS : 1.9 古いです。最新版は cvs-1.11.1-p1 のようですが、最低でも cvs-1.11 にして下さい。ここが一番怪しいかな。 ちなみに、最新版の cvsweb はこちらです。 http://www.idaemons.org/cgi-bin/cvsweb.cgi/cvsweb/ |
|
>>2342 68user >…と書いたところで今気づきましたけど、 >> CVS : 1.9 >古いです。最新版は cvs-1.11.1-p1 のようですが、最低でも cvs-1.11 >にして下さい。ここが一番怪しいかな。 cvs-1.11をインストールしてみましたところ、無事にcvswebも問題なく 動き出す様になりました。 最初に無礼を働いてしまったにも関わらず、解決まで長々と 付き合って頂き、本当にありがとうございました。 これからもちょくちょく来て、勉強させて頂きます。 ありがとうございました。 あと、ちょっとメインの話とはずれるのですが、 >>2340 68user にあった >co(1) というのはどのような時に書く方法なのでしょうか? |
|
>>2343 わたなべ > 無事にcvswebも問題なく動き出す様になりました。 それはよかったです。バージョンは? と聞いておきながら 古いのを見落としていたのは失敗でした。 >> co(1) > というのはどのような時に書く方法なのでしょうか? セクション番号を表します。セクション 1 はコマンドなので、 「co(1)」は「コマンド co」という意味です。 # http://X68000.startshop.co.jp/~68user/unix/pickup?man |
|
ありがとうございます。 >>2344 68user >セクション番号を表します。 あ、すでに書かれているところがありましたか…。ちゃんと見てから 質問しないとダメですね…。本当にすいません。 今回色々勉強させて頂きました。 本当に感謝感謝です。 なんだか、頼りっぱなしだったのでちょっと一人で勉強してきます。 また何かあったら質問しにくるかもしれませんが、その時はよろしく おねがいします。 |
|
はじめまして。ゆきと申します。当方の環境はSUN Sparc Solaris2.51 です。 会社でC++の環境が必要になり、UnixもC、C++もさほど詳しくない私が、 インターネットを頼りにgcc2.95.3のインストールをしました。 それで、渡されたC++のソースをコンパイルしたのですが、以下のような エラーが出ます。渡した本人は、エラーが出るのはおかしいと言って います。 % gcc -lstdc++ -o hello hellocpp.cpp hellocpp.cpp:1: iostream: No such file or directory hellocpp.cpp:2: string: No such file or directory これは要するにインクルードファイルを見に行けない状態なんだと 思いますが、gccのインストールが上手くいっていないのでしょうか? ちなみにC++のソースは以下です。 --------------------------------------------------------- #include <iostream> #include <string> using namespace std; class CHello { private: string m_strOut; public: CHello(){ m_strOut = "Hello World!"; }; virtual ~CHello(){}; void print(void); }; void CHello::print(void) { cout << m_strOut << endl; } int main() { CHello chHello; chHello.print(); } --------------------------------------------------------- 何でも良いので、何かお気付きのことがありましたら、教えて下さい。 よろしくお願い致します。 |
|
>2346 ゆきさんはじめまして iostream じゃなくて iostream.h、 string じゃなくて string.h だと思います。 h は Header に通常つく拡張子です。 |
|
とかいって、<iostream> だけの書き方もあるんですね。 手元の cpp ソースは、<iostream.h> でコンパイルできていたのを <iostream> だけにしたら同様のエラーが出たので、 「.h を付けてみる」をトライする価値はあると思いますが。 |
|
>2348 ふくしさんへ お返事ありがとうございます。土曜は会社に行っていないため、教えて 頂いたことはまだ試していないのですが、日曜に休日出勤(サービス) でもして試してみようかと思います。ところで、申し訳ありませんが、 もしご存知であれば、もう少し教えて頂けないでしょうか。 今回、私にソースを渡した人は、Linux環境で試したらしいのですが、 コンパイル時は gcc -lstdc++ -o hello hellocpp.cpp というふうにしろと言っています。調べてみるとオプション-lは、 ライブラリファイルへのリンクだと知りました。こちらのマシーンを 覗いてみますと、-lstdc++は、どうやら/usr/local/bin/libstdc++を 見に行くように指定しているようなのですが、これがファイルではなく、フォルダなのです。そういうことで、よろしいんでしょうか? しかし、仮にlibstdc++フォルダを見に行くとしても、libstdc++直下 には、iostream(.h)もstring(.h)もありません。これらは、 usr/local/bin/libioというフォルダの中にありました。 ふくしさんは、iostream.hとすると上手くいったということですが、 libstdc++フォルダの中に、iostream.hもstring.hもあったと認識して よろしいのでしょうか?もしそうなら、それらが入っていない私の 環境は、やはりインストール時の失敗ということでしょうか・・・ もしよろしければ、お教え頂けませんか?よろしくお願い致します。 |
|
>>2348 ふくし > とかいって、<iostream> だけの書き方もあるんですね。 C++ はよく知りませんが、namespace 対応の C++ コンパイラならば .h を省略できるはずです。 gcc は長らく namespace への対応がダメダメでしたが、少なくとも gcc-2.95.3 では OK です。 で、iostream はヘッダファイルです。libstdc++ はライブラリです。 ヘッダファイルがないと言われているのにライブラリのことを気に するのは間違っています。 >>2349 ゆき > これらは、usr/local/bin/libioというフォルダの中にありました。 それはライブラリのソースでしょう。それが /usr/local/bin/ に あるのはおかしいです。 > コンパイル時は gcc -lstdc++ -o hello hellocpp.cpp というふうに > しろと言っています -lstdc++ は不要です。C で -lc が不要なのと同じで、わざわざ指定 しなくても勝手に libstdc++ はリンクされます (指定してもいいですが)。 > -lstdc++は、どうやら/usr/local/bin/libstdc++を見に行くように > 指定しているようなのですが どうしてそのように判断しましたか? 普通 -lhoge とすると /usr/lib/libhoge* というファイルがリンクされます。 手もとの環境を見てみると、ヘッダファイルとライブラリは以下の 場所に置いてありますので、参考にしてみて下さい。 Solaris8 + gcc-2.95.2 /opt/sfw/include/g++-3/iostream /opt/sfw/include/g++-3/iostream.h /opt/sfw/lib/libstdc++.a.2.10.0 /opt/sfw/lib/libstdc++.so.2.10.0 FreeBSD + gcc-2.95.2 /usr/include/g++/iostream /usr/include/g++/iostream.h /usr/lib/libstdc++.a /usr/lib/libstdc++.so Linux + gcc-2.95.2 /usr/include/g++-3/iostream /usr/include/g++-3/iostream.h /usr/lib/libstdc++-libc6.1-2.a.3 /usr/lib/libstdc++-libc6.1-2.so.3 結局のところ、うまくインストールできていないのではないかと思います。 |
|
はじめまして。yamaと申します。 Perlで困っています。 STDOUTの初期化の方法がわかりません。 print文にてhtmlを出力していますが、途中でエラーが発生 した場合、出力済みの情報を初期化し、エラーメセージを出力したい と考えています。 *STDOUT=""; としましたが、エラー表示以前の分も出力されます。 このようなことは不可能なのでしょうか。 プロバイダ環境はUNIXでApacheのサーバです。 なお、UNIX、Apache、Perlのバージョン 等詳しくは聞いていません。 |