ssh、特定のシェルを起動し、リモートマシンでコマンドを実行しますか?


11

複数のユーザーがリモートマシンで同じユーザーアカウントを共有している状況です。自分の.zshrcファイルを書き込んだ「個人用」ディレクトリがあり、次の方法が欲しいのですが。

  1. 私のssh設定ファイル(例ControlMaster auto)からのディレクティブを使用して、リモートマシンでsshセッションを開始します。
  2. このセッションはZシェルを実行します
  3. それを実行します.zshrc(ない共有ユーザのホームディレクトリ上)私の「個人的な」ディレクトリに

エイリアスまたはそのようなsshセッションを開始する簡単な方法があればいいのですが(OpenSSHの構成ファイルを使用することを考えたのはそのためです)、他のアイデアは受け入れることができます!

OpenSSHの設定ファイルを使用していますか?

OpenSSHのssh_configのmanページを読んで、ディレクティブLocalCommandを使用して、サーバーに正常に接続した後にローカルで実行するコマンドを指定できます。これにより、サーバーに接続した後、リモートでconfig実行するコマンドをファイルに指示する方法はあるのではないかと思いましたが、そうではないようです。


できないと思います。しかし、なぜこれが必要なのか私は困惑しています。sshコマンドラインにはすでにコマンドがあります。なぜ走れないのssh mycommand?そして、sshを介して来るすべてのコマンドの前にいくつかのセットアップコマンドを実行する場合は、サーバー側を構成しないのはなぜですか?
Gilles「SO-邪悪になるのをやめる」

@Guillesに感謝します。複数のユーザーが同じリモートアカウントを共有している状況なので、リモートでログインするときにいくつかの設定をすばやく行いたいと思います。より具体的には、Zシェルを起動.zshrcして、特定のディレクトリ(つまり、「個人用」のホームディレクトリ)で実行するように要求します。私は試しましたssh -t host_name 'zsh & source /path/to/my_zshrc'が、うまくいきませんでした(私はを得たFPATH variable not defined、そしてそれはzsh実行前に終了するためだと思いますmy_zshrc。もちろん、これはZシェルを与えませんでした)
Amelio Vazquez-Reina

これはOPの更新に値すると思うので、更新しました。
Amelio Vazquez-Reina

私の同様の答えを探していたときこの質問はあなたがやろうとしていることにかなり近いと思います。
Gilles「SO-邪悪なことをやめよう」

回答:


15

コマンドをリモートで実行する最も明白な方法は、sshコマンドラインで指定することです。sshコマンドは、常にリモートユーザーのシェルによって解釈されます。

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

共有アカウントは一般に悪い考えです。可能であれば、ユーザーごとに個別のアカウントを取得してください。共有アカウントで立ち往生している場合は、エイリアスを作成できます。

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

公開鍵認証を使用する場合(ここでも、推奨)、で鍵ごとのコマンドを定義できます~/.ssh/authorized_keys。詳細については、この回答を参照してください。~/.ssh/authorized_keysサーバー上のキーの行を編集します(すべて1行で)。

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

素晴らしい@ギレス。このサイトへのあなたの貢献は、このサイトを私たち全員にとって非常に役立つリソースにしています。本当にありがとうございました。ちなみにexecコマンドは知りませんでした。直接exec zsh呼び出すのとどう違うのzshですか?この特定のケースでなぜそれが重要なのですか?
Amelio Vazquez-Reina

うーん、私が走るssh -t shared-account@example.com 'HOME=~/bob; exec zsh'と私はを得るHOME=~/bob: command not found。と思っていますtcsh。試しても同じ問題が発生しHOME=/home/bobます。bashとzshを試してみました。これを引き起こしている可能性がある手がかりはありますか?最後に、上の構文では、sshセッションを開いたままにできますか?(私が欲しいもの)。再度、感謝します。
Amelio Vazquez-Reina

1
@intrpc execは、元のシェルをzshに置き換えます。なしzshでは、元のシェルはzshが終了して終了するまでメモリに残ります。主な違いは、メモリの節約です。それほど重要ではありません。ログインシェルが(t)cshの場合は、を使用しますsetenv HOME ~/bob; exec zsh。最後に、引数なしでzshが開始されるため、実行sshしてログインシェルとしてzshを使用した場合と同じように、シェルセッションが取得されます。
Gilles「SO-邪悪なことをやめなさい」

ご協力ありがとうございます。ここでフォローアップの質問が1つあります。コマンドの後に、より多くのコマンドを実行する方法はありますexec zshか?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reinaドットファイルの1つを制御できない限り、便利ではありません。環境変数ZDOTDIRを設定して、zshが別のディレクトリでドットファイルを探すようにすることができます。ドットファイルをある程度制御できる場合は、add eval $LC_STARTUP_CODEto $ZDOTDIR/.zshrcを実行して、実行するコードを環境変数に渡すことができますLC_STARTUP_CODE
Gilles「SO-邪悪なことをやめなさい」

-3

サーバーに接続した後にリモートでコマンドを実行するには、.ssh / configファイルに次のスニペットを追加します

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
@ user626129に感謝しますが、元の質問で述べたように、LocalCommandコマンドはリモートシェルではなくローカルシェルでコマンドを実行することです。
Amelio Vazquez-Reina
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.