プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。私はLinux CentOS5を使っています。
あるユーザ(aaaとする)でログインシェルを/bin/cshにしています。

システムロケールをUTF8からSJISに変更すると(i18nファイルを変更しました)、
[aaa@centos ~]$ su - aaa
パスワード:
~: イベントが見つかりません.

となってcshスクリプトなどが使えず、/home/aaa/.cshrcも正常に読み込まれないようなので、/home/aaa/.cshrcで書いているPATHなどが通っていません。
わからないのは、システムロケールがUTF8の時は問題なくログインして.cshrcもちゃんと読めていたのに、SJISにするとエラーが起こることです。

どうかよろしくお願いします。

A 回答 (6件)

> こう書くのが普通なのですね・・・普通、というのがまだわかってないです。

/dev/の中にnullなんてものが・・・勉強します!

普通というか、名前無しパイプ(|)を使えば余計なファイルを作成せず、コマンドの標準入力に${path}を内容渡せますし、grepも終了ステータス(cshの場合$status)を見れば一致するものが見つかったかどうか分かるので。
あと、/dev/null は、例えばコマンド結果を画面やファイルに出力したくない場合にその出力を /dev/null に出力すれば破棄してくれる特別ものです。

> ログイン時のエラーはまだ、そのままです。

あれ、そうなんですか。
実際、修正して試したりしていないのでまだエラーになる所があるのかな。

> エラーを再現してくださったディストリは何ですか?

> [lean@brynhildr ~]$ cat /etc/redhat-release
> CentOS release 5.2 (Final)

とあるように CentOS 5.2 です。

この回答への補足

毎度ありがとうございます!
/dev/nullのこと、勉強になりました・・

よくよく探したら、DBのインスタンスディレクトリにもcshrcがあって、そこで引っかかっていました。
でもそれはたくさん「!~」があってしかもDB関連のファイルなので
修正するのがいやで、
~aaa/.cshrcの中で

setenv LANG ja_JP.UTF-8
source ~/sqllib/dbcshrc
setenv LANG ja_JP.SJIS

と書いて回避することにしました。
かなり変ですけど
dbcshrcはASKIIなんで、!~以外は関係ないはずなんで。。。

csh、SJISのバグっぽいですけど欧米のひとはSJIS使わないんで?ネット上ではちゃんとしたバグ報告は見つからず、いまいち歯切れが悪いですが、
上記の対応でエラーもなくなり、今は事なきを得ました。

Lean様、たくさん、ご教授いただいてほんとにありがとうございました。

補足日時:2008/10/02 18:25
    • good
    • 0

> echo ${path} > /tmp/wkpath.txt


> set tmp_path=`grep /usr/X11R6/bin /tmp/wkpath.txt`
> if ($?tmp_path) then
> setenv PATH "${PATH}:/usr/X11R6/bin"
> endif

は、

echo ${path} | grep '/usr/X11R6/bin' >& /dev/null
if (${status}) then
setenv PATH "${PATH}:/usr/X11R6/bin"
endif

かな。

この回答への補足

ありがとうございます!
こう書くのが普通なのですね・・・普通、というのがまだわかってないです。/dev/の中にnullなんてものが・・・勉強します!

/etc/csh.login
/etc/profile.d/krb5-devel.csh
/etc/profile.d/krb5-workstation.csh
を変更しました。

ログイン時のエラーはまだ、そのままです。
が、/home/aaa/.cshrcで指定するプロンプトが適用されるようになりました。.cshrcの途中まで適用できています。
プロンプト指定のあとに書いている環境変数は反映されていないので。

何度もありがとうございます。
ところで、Lean様がエラーを再現してくださったディストリは何ですか?
よろしければ教えていただきたいです。

補足日時:2008/10/02 09:11
    • good
    • 0

No.2です。



[lean@brynhildr ~]$ cat /etc/redhat-release
CentOS release 5.2 (Final)
[lean@brynhildr ~]$ cat /etc/sysconfig/i18n
#LANG="ja_JP.UTF-8"
LANG="ja_JP.SJIS"
[lean@brynhildr ~]$ locale -a | grep ja
ja_JP
ja_JP.SJIS
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
japanese.sjis

[lean@brynhildr ~]$ csh -f -X /etc/csh.cshrc
  :
if ( -r /etc/profile.d/krb5-workstation.csh ) then
source /etc/profile.d/krb5-workstation.csh
~: イベントが見つかりません.

[lean@brynhildr ~]$ csh -f -X /etc/csh.login
if ( 1 ) then
~: イベントが見つかりません.

/etc/csh.cshrc の方が /etc/profile.d/krb5-workstation.csh に、/etc/csh.login は /etc/csh.login 自体にエラーをなる部分があるみたいなので、それぞれのファイルを見ると

[lean@brynhildr ~]$ cat /etc/profile.d/krb5-workstation.csh
if ( "${path}" !~ */usr/kerberos/bin* ) then
set path = ( /usr/kerberos/bin $path )
endif
if ( "${path}" !~ */usr/kerberos/sbin* ) then
if ( `id -u` == 0 ) then
set path = ( /usr/kerberos/sbin $path )
endif
endif

[lean@brynhildr ~]$ cat /etc/csh.login
# /etc/csh.login

# System wide environment and startup programs, for login setup

if ($?PATH) then
if ( "${path}" !~ */usr/X11R6/bin* ) then
setenv PATH "${PATH}:/usr/X11R6/bin"
endif
else
if ( $uid == 0 ) then
setenv PATH "/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin"
else
setenv PATH "/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin"
endif
endif

setenv HOSTNAME `/bin/hostname`
set history=1000

if ( ! -f $HOME/.inputrc ) then
setenv INPUTRC /etc/inputrc
endif

どちらもif文の中の「!~(文字列比較)」は演算子として正しいのだけれど、ロケールがSJISの時には何故かヒストリ展開されているみたい。
たぶん、/etc/profile.d/krb5-workstation.csh の方が先に読み込まれるのでこっちでエラーになっているのだと思う。

個人的には、もともとロケールにSJISがなく、追加してもこういう状況になるならロケールSJISでは使用しないかな。
PATHの設定で「!~」の右側がPATHに含まれていないならPATHに追加しているので、「!~」以外でPATHに含まれているか調べるようにするか、無条件に付けたりする等して対処かな。

この回答への補足

すごいです!ありがとうございます!
わざわざ再現してくださったなんて。。。

ご提示くださった2方法のうち、無条件にsetenvにしたら
PATHにログインするたびに文字列が増えるように思います。
ログアウトしたら必ず消すようにしたらいいのかもしれないですが。

それでまず、!~を使わないように/etc/csh.loginをカスタマイズしようと試みました。

# /etc/csh.login

if ($?PATH) then
echo ${path} > /tmp/wkpath.txt
set tmp_path=`grep /usr/X11R6/bin /tmp/wkpath.txt`
if ($?tmp_path) then
setenv PATH "${PATH}:/usr/X11R6/bin"
endif
else


!~のかわりにgrepを使うことにしました・・
これで4行めifに1が返ってきたら、環境変数の文字列が追加されることがわかりました。
cshコマンドXオプションでもエラーは出てません。

今はcsh.loginだけですが、 /etc/profile.d/krb5-workstation.csh のほうもこれでやってみるつもりです。

Cシェルプログラミングは初めてなんですが・・なにかまずいことがあるようでしたら
教えていただければ幸いです。

というか、ここまでご回答くださっただけでも大感激です。
ほんまにありがとうございます。

補足日時:2008/10/01 12:21
    • good
    • 0

No.2です。



> そのプロンプトで!使うの削除して
> utf8の状態でhistory 全削除して、
> i18nファイルsjisにして
> ログインしてみましたが一緒でした・・。

そうすると システムファイル /etc/csh.cshrc の方かな。

あと、cshと言ってもtcshだろうから、$HOME/.tcshrc があれば $HOME/.cshrc は読み込まないというのもあるし。
また、「su -」してるからログインシェルになると、システムファイルの /etc/csh.login とか $HOME/.login あたりも読み込むだろうから見てみるといいかも。

この回答への補足

たびたびありがとうございます。

$HOME/.loginにもプロンプトで!マークを使ってました。
ので!マークは削除してみました。
$HOME/.tcshrcは存在しませんでした。
で、もう一度ログインしてみましたが状況は同じでした・・・
そして、さらにわからないのが

[aaa@cenos ~]$ csh
~: イベントが見つかりません.

てなることです。
cshスクリプトのあるディレクトリまで移動して

[aaa@cenos ~]$ ./scriptname
~: イベントが見つかりません.

でもこうなります。
泥沼にはまっています...

補足日時:2008/09/30 15:56
    • good
    • 0

> ~: イベントが見つかりません.



cshのヒストリ置換が出来なかった時のメッセージじゃないかな。

○cshヒストリ置換失敗例
%history
1 14:18 ls
2 14:18 ps
3 14:18 history
%!vi
vi: イベントが見つかりません.

.cshrc内のどこかに ! があったりしますか?

この回答への補足

回答投稿ありがとうございます。

!あります。プロンプト指定するのにコマンド番号表示で。

そのプロンプトで!使うの削除して
utf8の状態でhistory 全削除して、
i18nファイルsjisにして
ログインしてみましたが一緒でした・・。

補足日時:2008/09/30 14:45
    • good
    • 0

たとえば「/home/aaa/.cshrc の中に日本語が入っている」とかいうことはない?

この回答への補足

早速ありがとうございます。

~/aaa/.cshrcはASKIIなんです。
viなどで見た目には日本語なくても、たとえば改行コードとかおかしくなったりしてんのかとも思ったんですが
調べ方がわからなくて。

補足日時:2008/09/30 12:51
    • good
    • 0

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