watanet personal side-B

Welcome

こんにちは。chihiroです。
Linuxとアニメ、マンガネタが多いかも?
イワタバコ科の植物も大好き。写真も撮るかなぁ〜。
そんな日常。

Contents

TOP
Message Board
コンピュータ関連

Search


Calender

7月 2010
       

Categories

Archives

Contact

RSS


あわせて読みたいブログパーツ

Smartfm_banner_2

Multicolumn Twitter Client on Web

Firefox 2 無料ダウンロード

ご近所さん

超人

IKAKICK - ラッキィ池田事務所
踊り放題! - ラッキィ池田BLOG
TOGETHER - ルー大柴BLOG
浅井企画

Linux

日本のLinux情報
Linux Software Search(J)

もじら組
mozilla.org
Mozilla 日本語ローカライズ版リンク集
Mozilla 日本語インストーラ

Japanized Apache Server Project
The Apache Software Foundation
日本PHPユーザー会
PHPマニュアル
CPAN - Comprehensive Perl Archive Network

Qmail
Qmail(Jp1)
Qmail(Jp2)
Binc IMAP

日本Sambaユーザー会

Fedora Project(E)
Fedra JP Project(J)
Vine Linux(J)
Debian(J)
Debian JP Project(J)

とほほのWWW入門

トップページ > linux > sshで、サーバ側へ環境変数を引き渡す方法 - ssh AcceptEnv PermitUserEnvironment
2009/11/04 (Wed)

sshで、サーバ側へ環境変数を引き渡す方法 - ssh AcceptEnv PermitUserEnvironment

以前以下の日記で、 sshのX転送を利用してリモートでXクライアントを実行した際、 Xの日本語入力機能が有効にならない、という現象のトラシューを行った。

原因は、リモートで環境変数(XMODIFIERS)が設定されていなかったため、と解った。
以前の日記では、リモートの.bashrc等に環境変数の定義を行って回避した。

  1. sshでリモートに接続
  2. シェルからxクライアントの起動

以前想定していた操作は上記2ステップでの実施。
上記の順番でアプリを起動する場合は、以前の処置で問題ない。

しかし以下のように実施した場合は、問題がある。

  1. $ ssh -X -Y sshsv firefox

sshでsshsvへ接続して直接firefoxを起動する場合の、コマンド入力例。
この場合は、シェルの起動スクリプトが読み込まれないので、 .bashrc等への環境変数定義は効果がない。

リモートのsshdがコマンドを実行している(?)と想像すると、 sshd自体に環境変数を引き渡す方法が無いと困る。

というわけで、今回はssh、sshdの間での環境変数の引き渡し方法について調べてみます。

  • man sshd_config
    • AcceptEnv
    • PermitUserEnvironment
  • AcceptEnvを利用する方法
    • 1. サーバ側の sshd_config 設定
    • 2. クライアント側の ssh_config 設定
  • PermitUserEnvironmentを利用する方法
    • 1. サーバ側の sshd_config 設定
    • 2. ユーザ個別の設定
    • 2-1. サーバ側の ~/.ssh/environment の設定の場合
    • 2-2. サーバ側の ~/.ssh/authorized_keys の設定の場合
  • 以上にて

man sshd_config

sshdがリモートでコマンドを実行するのだから、 sshd_configの設定に環境変数引き渡しにん関する設定が無いか確認してみる。

man sshd_configで確認。

すると、以下の2つのオプションが見つかった。

AcceptEnv

自動でクライアント側からサーバへ環境変数を引き渡す設定です。
サーバ側sshd_configには、AcceptEnvに受け入れ環境変数の設定が必要。
クライアント側ssh_configには、SendEnvに引き渡す環境変数の設定が必要。

AcceptEnv
Specifies what environment variables sent by the client will be
copied into the session's environ(7).  See SendEnv in
ssh_config(5) for how to configure the client.  Note that envi-
ronment passing is only supported for protocol 2.  Variables are
specified by name, which may contain the wildcard characters '*'
and '?'.  Multiple environment variables may be separated by
whitespace or spread across multiple AcceptEnv directives.  Be
warned that some environment variables could be used to bypass
restricted user environments.  For this reason, care should be
taken in the use of this directive.  The default is not to accept
any environment variables.

PermitUserEnvironment

ユーザが任意の環境変数を引き渡せるようにする設定。
デフォルトでは"no"。
sshd_configには、PermitUserEnvironmentの設定が必要。
サーバ側の~/.ssh/environment、もしくは~/.ssh/authorized_keys設定が必要。

PermitUserEnvironment
Specifies whether ~/.ssh/environment and environment= options in
~/.ssh/authorized_keys are processed by sshd(8).  The default is
``no''.  Enabling environment processing may enable users to
bypass access restrictions in some configurations using mecha-
nisms such as LD_PRELOAD.

AcceptEnvを利用する方法

前述したとおり、自動でクライアント側からサーバへ環境変数を引き渡す設定です。
サーバ側sshd_configには、AcceptEnvに受け入れ環境変数の設定が必要。
クライアント側ssh_configには、SendEnvに引き渡す環境変数の設定が必要。
クライアント毎の設定が可能です。サーバとクライアント両方に設定が必要になります。

以下では例に、環境変数XMODIFIERSを引き渡す設定を行います。

1. サーバ側の sshd_config 設定

サーバ側の/etc/ssh/sshd_configを以下の様に修正します。

変更前:
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
変更後:
# Allow client to pass locale environment variables
AcceptEnv LANG LC_* XMODIFIERS

設定後、sshdを再起動します。

2. クライアント側の ssh_config 設定

クライアント側の/etc/ssh/ssh_configを以下の様に修正します。

変更前:
SendEnv LANG LC_*
変更後:
SendEnv LANG LC_* XMODIFIERS

設定後、AcceptEnvを設定したsshサーバへ接続、 envコマンドで環境変数の設定状態を確認します。

PermitUserEnvironmentを利用する方法

ユーザが任意の環境変数を設定できます。
設定も、サーバ側のみで完結するので、クライアント毎に設定する手間はありません。
共通の環境変数を設定するには楽な方法。

以下のHPを参考にしました。詳しいです。

以下、実験してみたのでまとめてみます。

1. サーバ側の sshd_config 設定

サーバ側の/etc/ssh/sshd_configへ、以下の設定を行います。

PermitUserEnvironment yes

設定後、sshdを再起動します。

2. ユーザ個別の設定

続いて、以下の2つの設定のうち、どちらかを行います。

2-1. サーバ側の ~/.ssh/environment の設定の場合

サーバ側の ホームディレクトリ配下にある ~/.ssh/environment ファイルに、 sshログイン時に自動設定したい環境変数の設定を行います。

XMODIFIERS=@im=SCIM

2-2. サーバ側の ~/.ssh/authorized_keys の設定の場合

サーバ側の ホームディレクトリ配下にある ~/.ssh/authorized_keys ファイルに、 sshログイン時に自動設定したい環境変数の設定を行います。

サーバ側のauthorized_keysへの設定は、 以下のように、ログインするユーザ名@ホスト名が記された公開鍵が記述された行の、 先頭に書くみたいです。
以下の記述例では、ssh-rsaの左側に、environment=〜と設定行を記述しています。

environment="XMODIFIERS=@im=SCIM" ssh-rsa DBRS+bk....basDR== user@client

詳しくは、man authorized_keysをご覧ください。

最初、クライアント側のファイルに記述して、反映されずにハマりました。
man sshd_configの内容をちゃんと読むと「sshdにより処理されるファイル」として ファイル名が列記されているので、サーバ側で正しいはず。

以上にて

以上で、sshを利用して、リモートでxクライアントを直接起動した場合にも、 環境変数XMODIFIERSが設定されるようになりました。
日本語入力もシームレスです。

2種類の方法が出てきました。比較すると、以下のような使い分けかも。

  • AcceptEnv -> クライアント毎に異なる環境変数
    (クライアント側の必要に応じた設定)
  • PermitUserEnvironment -> クライアント関係なく共通共通
    (サーバ側の必要に応じた設定)

接続元の環境によって環境変数XMODIFIERSが異なる場合はAcceptEnv。
クライアント毎の設定も必要。

接続元の環境変数XMODIFIERSが共通なら、 サーバ側でPermitUserEnvironmentの設定を行えば、 クライアント側の調整無し。

目的に応じて使い分けるのが良いかと。


Posted at 2009/11/04 18:09 in /linux
ソーシャルブックマークへ登録 ブックマークに追加する