最近、zftp を使っているのだが、 つい close しわすれてしまうのが悩みの種である。 そこで、PS1 に ftp 先の host を表示するようにしてみる。 また、それに必要だったため、ついに promptsubst を設定する。
妄想、そのいち: SRCP (Simple Revision Control Protocol)
cvs protocol は腐っているので代わりを作る。 (って、PRCS2 や BitKeeper の protocol がまともならいらないか。)
妄想、そのに: zsh module for debian
dpkg や apt-cache を起動して package の list を 得るのはあまりに効率が悪いので、直接得てしまう。
BitKeeper が release されたもよう。
ふと、xhost でそのホスト自身から接続可能になっていることに気がつく。 デフォルトでは禁止している(xauth をつかっている)はずなのだが、 そういえば必要があって許可を加えたような覚えがある。
そこで、禁止しようと思い、xhost -localhost
とするが、
なぜか禁止できない。
xhost -inet:localhost
などとしてもだめである。
さんざん試した後、
ps で確認して X サーバに -auth option がついていないことに気がつく。
衝撃を受けつつ更に調べてみると、
X の起動は ssh-agent xinit -- -auth ... としているのだが、
xinit に -- が渡されていないというのが真相のようである。
つまり、xinit が -auth を(サーバでなく)クライアントへの引数として解釈し(そして無視され)ていたというわけである。
以前は問題無かったので、問題は ssh-agent の挙動が変化したことである。 とすれば、まずまちがいなく普通の SSH と OpenSSH の違いによるものであろう、 というわけで確認する。
確認してみると、普通の SSH が自前で引数を処理しているのに対し、 OpenSSH では getopt を使っている。 なるほどこれならそうなるのもうなずけるというわけで原因究明は終了。 対策は(getopt 化は喜ばしいことであり、bug ではないので) こちら側で行なうことにする。
最初は ssh-agent sh -c 'xinit -- -auth ...'
として試したのだが、
getopt が -c をオプションとして認識するのでうまくいかない。
(sh 'xinit ...'
として起動するので、 xinit ... というファイルが見つからないというエラーが出る。)
結局、普通の SSH も -- を受け付けることを思い出し、
ssh-agent -- xinit -- -auth ...
とした。
さて、そもそもなぜ xhost の許可を確認したかというと、su した状態で X クライアントが動くかどうかという話を確認したかったからである。 もちろん、xhost で localhost に対して許可が与えられていれば動くのは当たり前なので、 xauth を使った場合のことである。
さて、xhost でまったく許可を出していない状態で、su して X クライアントを実行してみると... ちゃんと動く。 動くこと自体はおかしくはない。 root 権限があれば(home が NFS でないかぎり)元のユーザの .Xauthority を読めるので、 ちゃんとそちらを読むように設定すれば動くはずである。
しかし... 読んでいる気配が無い。 環境変数 XAUTHORITY は設定されていないし、 strace で調べてみると、/root/.Xauthority が読まれている。 そこで、xauth list としてみると... なぜか元のユーザで設定した cookie がコピーされている。
調べていくと、どうも su が xauth をいじくっているらしいことがわかる。 sh-utils 2.0 を調べてもそれらしきコードはないので、 Kondara から sh-utils-2.0-1k4.nosrc.rpm をとってきて調べる。 どうやら、pam_xauth というのがあって、これが面倒を見ているらしい。 そこで、確認の意味で /etc/pam.d/su をいじって pam_xauth を disable すると su は xauth をいじくらないようになった。
というわけで、最近は(RedHat 系に限り?)あまり考えずに su しても X クライアントは普通に動くらしい。 試していないけれど、pam_xauth がユーザ権限でホームディレクトリを読むとすれば home が NFS であっても動くのだろう。
ちなみに、home が NFS の場合をあきらめれば、 (pam_xauth のようなものがなくても)環境変数 XAUTHORITY を設定しておくことにより、 su しても X クライアントが動く環境を作ることが出来る。
なお、sudo の場合は、環境変数 HOME を変えないため、XAUTHORITY を設定していなくてもユーザの .Xauthority を読む(ことに挑戦する)ことになる。つまり、NFS でなければ動く。
.Xauthority が読めないのは NFS の場合だけではなく、root 以外に su する場合もあることに思い至る。 pam_xauth ならこの状況にも対応できるはず、と思って試してみるがうまくいかない。 ソースを取り寄せ、この時点でやっと pam_xauth(8) があることを知る。 読んでみると、デフォルトでは root 以外にはコピーしないが、 ユーザの設定次第で他のユーザの場合にもそうすることが出来るということらしい。 (もちろん、root にはそうしないということも出来る。) 設定して再度試すとうまくいく。なるほど。
思ったのだが、「x 以上」や「x 以下」は x を含むのに、「x 以外」はなぜ x を含まないのだろう...
記念に(?) _xauth を書く。 最初、xauth generate がいまひとつわからなくて悩んだ。
Completion 中の directory 再構成の議論が始まったばかりのところで、 新しいファイルを加えるのにはちょっと気がひけたが、結局加えてしまう。
再構成の話で、Geoff がすごいことをいっている。 cvs でファイルを移動する場合に、 以前の log を消さず、かつ、 古いバージョンを取り出した場合にはちゃんと正しい場所(移動する前の場所)に出てくるようにする、 という方法なのだが... 確かに正しく動きそうな気もするけど... 一度やってみたいという気もするけれど... でもちょっと恐い。
非対話的に ftp で put するには、ftp -n に here document で標準入力から ftp command を送り込みます。 (open ftpserver, user username password, cd directory, put filename とか。)
標準入力を put するには filename を | で始めて cat を起動し、 redirect を駆使して 3番あたりを経由して外の標準入力をつなぎ... ってそれは必要ないか。
でも、emacs でやることを検討してみては?
なら、やはり emacs を...
FreeBSD 4.0 で make check して気がついたのだが、
% df / Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s2a 49583 24934 20683 55% / % grep ad0s2a /etc/fstab /dev/ad0s2a / ufs rw 1 1 % ls -l /dev/ad0s2a crw-r----- 1 root operator 116, 0x00030000 May 1 04:40 /dev/ad0s2a
character special device を mount している。 なぜなのだろうか?
すくなくとも、fstab(5) を読む限りはいけないような気がするけれど...
_look を書く。 候補を求めるのに look 自身を呼び出してその結果を使うというのはひどい話だ。 実際に実行する意味がほとんどなくなってしまうではないか...
こんなかんじですかね...
(defvar ssh-relay-host "dejima") (defvar ssh-relay-user "user") (defvar ssh-relay-key "relay-identity") (defvar ssh-relay '(("host1" . "port1"))) (defun open-ssh-stream (name buffer host service) (let ((process-connection-type nil)) (start-process name buffer "/bin/sh" "-c" (format "unset SSH_AUTH_SOCK; exec ssh -a -x -q -i %s -l %s %s %s %s" ssh-relay-key ssh-relay-user ssh-relay-host host service)))) (defadvice open-network-stream (around ssh-relay activate) (let ((host (ad-get-arg 2)) (serv (ad-get-arg 3))) (setq ad-return-value (if (member (cons host serv) ssh-relay) (open-ssh-stream (ad-get-arg 0) (ad-get-arg 1) host serv) ad-do-it))))
authorized_keys はこんなかんじで。
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="exec socket $SSH_ORIGINAL_COMMAND" ...
まぁ、coding-system もなんか対処しといたほうがいいかも。 あと、member では機能が低すぎというのもあるかも知れない。
でも、それはともかく Gnus はへーきで動くのに Liece が動かないのはなぜだろう。
ゾンビを殺すとどうなるのだろうか...
すくなくともあまりうまく運べないらしい。
考えてみればたしかにそれでいいですね.. (無駄な process を減らすために exec したほうがいいかも。)
authorized_keys をいじくることに固執してしまったのは、 以前試した cvs via ssh のときの前提がこびり付いていたからかなぁ... うぅむ。他人のことはいえないなぁ。うん。
基本的に、環境変数は .zprofile で設定して子子孫孫までうけつがせるという方針なのだが、 これは設定を変更した時に再ログインしないと変更が有効にならないという問題がある。
変更時にどうにかする細工を入れるかどうか検討中。
viewcvs にenscript を使って elisp に色をつける変更が入った。
なんか cvsweb に比べて将来有望な気がする。
入った、 と思ったらすぐに一般化されて elisp 以外のものも扱うようになった。 すばらしい。
OpenBSD の awk は one true awk であることに気がつく。 sh が pdksh なのもそうだけど、なんとゆーか正統派だなぁ。
bug report を 4つ連続して送った後に sunsite.auc.dk が落ちていることに気づき、ちょっと萎える。
CVS (という directory)が補完の対象に(すぐには)ならないようにする設定をいろいろ試していて、 その一環として試してみたかったので 報告してみました。 まぁ、結局は tag-order を使うことにしたんですがね。
ふと、とある WebChat で、自力で reload するのに疲れ、 自動で reload しつつファイルに追加していく簡単な script を書いてみた。 あとは IRC に流し込めば完成だが...
標準入力を特定の server/channel に流し込む簡単なツールってないんですかね?
FreeBSD の pty が [pt]ty[p-sP-S][0-9a-v] であることに気がつく。ふむ。
最近、freshmeat newsletter を subscribe した。 興味を引いたもの:
お手軽な socket(1) の代替物ってないかなぁ。 中途半端な server mode はいらない (tcpserver 並の機能があればあってもいいかもしれない)けれど、 configure は必須。
単に print -P するだけの chpwd なら、 そもそもなぜ PS1 に直接入れてしまわないのか、 という疑問が湧かないでもない。
echo '声繊 賎漸船薦製摺賎全全前精政政膳膳膳成膳棲成鮮漸詮政摺西繊閃腺賎鮮漸声政繊西'|lv -Iu8
ふむ。(EUC-JP)
perl の module に ms-tnef のデコーダがある模様。 個人的には最近見かけないが...
CVS の web インターフェースに足りないものは全文検索なのではないだろうか。 大雑把に CVS リポジトリ自体を対象にしても結構使えるものが出来るのではないかと思う。 RCS ファイルにはソースのすべての行が(だいたい)生で入ってるわけだし。 まぁ、プログラミング言語を理解してインデックスを作ってくれればそれに越したことはないが、 マイナーな言語のサポートは期待できないのが難点だな。
ふと cvsu-0.1.4 に CVS/Root や CVS/Repository を書き換えるツールがあることに気がつく。 個人的にはあまり必要になったことはないが...
文字コードが腐っていたのは、 むろん単なるミスです。 なぜ意図的だなどと思うのだろう...
システムの TODO に charset の検証をするというのを追加。
w3m だと読めてしまうのでした。
ここのところ、(ssh さえ通らない)firewall の中に巣食っているので、 端末に使っているマシンから sourceforge に直接繋げない。
socks でも試すか、とも思ったが、結局 ssh を二段重ねで起動するという暴挙に出ることにした。
ssh -x -q relay-host ssh -a -x -q cvs.zsh.sourceforge.net cvs server
終了時に Waiting for forwarded connections to terminate... などといわれるのがなんだが... 一段目で auth socket を forward しないと二段目がつながらないしなぁ。
passphrase 無しの鍵を sourceforge に登録すればいいのだろうけれど。
そーか。ProxyCommand を使えば forward しなくてもすむんだな... そのかわり socket を使わないといけないけれど。
ssh -o 'ProxyCommand exec ssh -a -x -q relay-host exec socket cvs.zsh.sourceforge.net ssh' -a -x -C -q -l akr cvs.zsh.sourceforge.net cvs server
socket は comp.sources.unix にながれたものです。 FreeBSD には sysutils/socket という ports があります。
この類のものはいろいろあるんじゃないかな。netpipes とか。 あと、SunOS の mconnect とか。
つい現実逃避して cvs 関係のメモをまとめてしまった。 (まとめおわっていないけれど。)
tcvs はちょっと期待大かも。
今日のシェルスクリプト
#!/bin/sh socket -sflp ' echo >&3 exec 4>&1 ( exec 5>&1 ( exec 6>&1 tee /dev/fd/5 | cvs -f --allow-root=/home/akr/.cvsroot pserver 2>&6 | tee /dev/fd/4 | exec awk '\''{printf("S>%s\n", $0); fflush()}'\'' >&3 ) | exec awk '\''{printf("S2>%s\n", $0); fflush()}'\'' >&3 ) | exec awk '\''{printf("C>%s\n", $0); fflush()}'\'' >&3 ' 2401 3>&1
まぁ、rake があればもっと簡単にできたはずだけど... すぐにアクセスできるところにおいてなかったからなぁ。
rake 版:
socket -sflp ' rake -logfd 3 \> -command '\''sh -c "cvs -f --allow-root=/home/akr/.cvsroot pserver"'\'' \> err:0/3 ' 2401 3>&1
.cvsignore については * とだけ書けばいいような気が。
ホームディレクトリ直下のファイルを cvs で管理する なら、どこか適当な場所に checkout してから、中身(CVS ディレクトリと管理されているファイル)をホームディレクトリに mv すればいいだけのような気が。
[latest]