対話モードに入る前にsshセッションを開始するときにいくつかのコマンドを実行できますか?


13

sshコマンドでsshセッションを開始するとき、2つのオプションがあるようです-デフォルトenvとホームディレクトリから開始するデフォルトのインタラクティブセッション-または任意のコマンドを実行しますが、非インタラクティブに(ssh "command; command; bash -i -l"あまりうまくいかないようなトリックでも)。かなり頻繁に対話型セッションが必要ですが、その前に何かが発生しています-通常はディレクトリの変更、または場合によってはシステム環境の調整。これらのことはセッションごとに異なるので、単にそれらに固執することはできません.bashrc

それを実現する方法はありますか?

回答:


13

私はついに秘密を発見したので、私は自己回答しています。の-tオプションssh-lオプションのオプションもbash、それ自体ではログインシェルになりませんが、組み合わせて機能します。

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'ディレクトリ、セットの環境変数を変更し、適切なログインシェルを起動します(私がこれまでに見つけた唯一の違いはつまり/etc/motd、このように表示されていない-それは、通常だ sshのか、login責任、ないのbashすべてが思わ以外-さんを完全に機能し、すべての環境変数は同一です)。

これらの環境/ディレクトリの変更はsshの後に発生するためPermitUserEnvironment、関連する設定によって(厳密には計画どおり)制限されず、.bashrc/ .profileが実行される前に行われます。これには長所と短所があります-のようなbash initスクリプトから設定されるものを単にオーバーライドするのは難しくなりますが、コマンドラインにPS1正確な値を正確に詰め込み、すべての面倒な作業を行うのは簡単です。ssh.profile

そして本当に必要な場合、.profileコマンドラインで次のようにbashに何かを実行させるのは実際には非常に簡単ですssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'-そのようにすると非常にい.profileですが、これらの代替ファイルは前に準備することができます。(私が知る限りbash.profileスクリプトの候補場所がいくつかあり、最初に見つかった場所を実行します- . fileそのような自動フォールバックはないので、それを行うには通常の場所を確認する必要がありますprofile


素晴らしい、これをありがとう!私はsshを実行した直後にユーザーのアカウントにsuでログインする方法を探していましたが、「-t」オプションによって機能しました。そのオプションがないと、シェルにはプロンプトが表示されず、コマンド履歴が表示されず、SIGINTで終了します。
Ashoat

この答えは非常に役立ちますが;、最初のsshログイン文字列からs が欠落しています。十分な変更を行っていないため、回答を編集できません。これがうまくいきましたssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'。それがあなたの意図したことだと思います。
ロブクワソフスキ

2

.bashrcを編集し、SSH固有の環境設定を以下で囲みます。

if [ $SSH_TTY ]; then
    ...
fi

これにより、SSHセッション専用の設定を追加できます。「もちろん、セッションごとに異なる任意の環境変数を最初から設定することだけが必要な場合、それらを入力する以外にマシンに推測させる方法はわかりません...何があっても、あなたは」設定の選択の基礎となるいくつかのテスト可能な条件が必要です。


2

sshmanページから:

さらに、sshは〜/ .ssh / environmentを読み取り、ファイルが存在し、ユーザーが環境を変更できる場合、「VARNAME = value」という形式の行を環境に追加します。詳細については、sshd_config(5)のPermitUserEnvironmentオプションを参照してください。

それは言う:

PermitUserEnvironment〜
/ .ssh / environmentおよびenvironment =オプションの〜/ .ssh / authorized_keysがsshd(8)によって処理されるかどうかを指定します。デフォルトは「no」です。環境処理を有効にすると、ユーザーはLD_PRELOADなどのメカニズムを使用して、一部の構成でアクセス制限をバイパスできます。

この機能は、ミッキーが提案~/.bashrcしたif構造を使用して、リモートでステートメントを条件付きで実行するために使用できます。


1

この方法で実行するだけです: ssh -t yourdomain 'cd /yourpath; bash'

  • -t :プロンプトが表示されるように
  • ; bash:コマンドを実行して(ここでcd)sshセッションを終了しても、コントロールを戻すように

ServerFaultへようこそ!コマンドまたはスクリプトの説明やドキュメントを提供し、それらの目的を説明してください。
コーリーKnutson

1
あなたが要求したとして感謝@CoryKnutson、私は変更を行った
スミットRamteke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.