/etc/profile.d のスクリプトが終了状態 1 で終了したため、サーバーに SSH で接続できません。 [閉じる]

/etc/profile.d のスクリプトが終了状態 1 で終了したため、サーバーに SSH で接続できません。 [閉じる]

だからこの問題が発生しました。 SSHを使用してサーバーにログインできません。望むより:

ssh -v myuser@myserver
debug1: Authentication succeeded (password).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
Last login: Sun Jul  5 20:10:54 2015 from x.x.x.x
-bash: KSH_VERSION: unbound variable
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: client_input_channel_req: channel 0 rtype [email protected] reply 0
debug1: channel 0: free: client-session, nchannels 1
Connection to x.x.x.x closed.
Transferred: sent 2264, received 2800 bytes, in 0.2 seconds
Bytes per second: sent 13241.8, received 16376.8
debug1: Exit status 1

問題は、「-bash:KSH_VERSION:unbound変数」によって接続が失われているようです。なぜこれが起こるのかわかります...私は/etc/profile.dに入れるスクリプトを書いていますが、そのスクリプトには "set -euo Pipelinefail"があります(申し訳ありません)... "o"オプションは "nounset"で、これは「バインドされていない変数」を説明します...スクリプトがオプションを設定すると、バインドされていない変数でvim.shが失敗します。

今、この問題をどのように解決するのですか? SSH経由でファイル削除コマンドを送信できません。たとえば、他のユーザーとしてログインできず、他のシェルを使用できず、「--noprofile」および「--norc」オプションbashが機能しません。 ...私が試したことはどんなトリックも動作しません...

どんなアイデアがありますか?

答え1

私も同じ問題がありましたが、ついに解決策を見つけました。

@nkmsが述べたように:

/etc/profileをインポートする前にログインプロセスを中断する(Ctrl + C)確率は約1/3(少なくとも私は1/3)です。

確率を上げるために、次のループを使用しました。

$ (trap '' INT; while true; do ssh myuser@myserver; done)

スクリプトはサブシェル '(' を起動し、そのサブシェルの ctr-c コマンドを無効にします (trap コマンドを使用)、その後 ssh コマンドを繰り返します.これが増加し、適切な瞬間を捉えること。

...奇跡的に動作します!

答え2

/etc/profileをインポートする前にログインプロセスを中断する(Ctrl + C)確率は約1/3(少なくとも私は1/3)です。

$ ssh -v localhost
OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013
........
Authenticated to localhost ([::1]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
Last login: Tue Jul  7 19:46:42 2015 from localhost
^C-bash-4.2$ 

いくつかのことを明確にするために編集されました。

sshdがサーバー上でセッションを開くと、ユーザーのシェル(この場合は/ bin / bash)を読み取ってそれを行います。

bashまたはsshコマンド(sftpを含む)を実行するときに提供されるオプションは重要ではありません。 sshコマンド(sftpを含む)またはbashオプションがbashインスタンスに渡されます。後ろにセッションが開いています。このインスタンスの動作を制御できません。たとえば、

client$ ssh localhost bash --noprofile --norc

サーバーのstrace出力:

[pid 60047] execve("/bin/bash", ["bash", "-c", "bash --noprofile --norc"], [/* 16 vars */]) = 0
[pid 60047] execve("/usr/bin/bash", ["bash", "--noprofile", "--norc"], [/* 28 vars */]) = 0

ご覧のとおり、sshコマンド( "bash --noprofile --norc")は、最初のexecveの "-c"オプションを使用して "bash"に引数として渡されます。

制御できない bash の最初のインスタンスは ~/.bashrc です。その後、/etc/bashrcが読み込まれ、/etc/profile.d/の下にスクリプトがロードされます(少なくともRed Hatシステムではそうではありません。)他の人についてはわかりません。

[pid 60047] open("/home/user/.bashrc", O_RDONLY) = 3
[pid 60047] open("/etc/bashrc", O_RDONLY) = 3

私が考えることができる唯一の方法は、スクリプトをロードする前にログインプロセスを中断するのに十分速いですが、セッションを中断するのに十分速くはありません。 - ログインプロセス中により多くの時間を提供するためにシステムの負荷を増やすこともできます(可能な場合)。

PS:回答が役に立つと思われる場合は表示してください。

答え3

失敗しましたかsftp?そうでない場合は、これを使用して1つを配置できます。いいね /etc/profile.d ファイルがそこにあります。

答え4

これはうまくいきませんが、SSH接続を確立するときにKSH_VERSION値を送信することができます。

KSH_VERSION=x ssh -v -o 'SendEnv=KSH_VERSION' myuser@myserver

アイデアは、環境変数を特定の値に設定して、bashが設定されていないと文句を言わないようにすることです。デフォルトのSSHサーバー構成では、この特定の変数を設定できないため、機能しないようです。これは、誰かがこの特定のサーバーで設定をさらに許可する理由がある場合にのみ機能します。

関連情報