SSH、ログイン時にコマンドを実行し、ログインしたままにしますか?


29

私は期待してこれを試しましたが、うまくいきませんでした:それは最後に接続を閉じました。

リモートマシンにログインし、コマンドを実行し、切断しないスクリプトをssh経由で実行できますか?

そのため、マシンでsshし、そのようなディレクトリにcdし、コマンドを実行して、ログインしたままにします。

-ジョナサン

(私が使用することを期待)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
それは私だけですか、それとも、パブキーや他の健全な方法を使用する代わりに、この方法でパスワード認証を「自動化」していますか?
悲しみ

回答:


25

; /bin/bashリモート側のコマンドラインの最後にa を追加しますか?あれは:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

さらに良いことに、ルートの.bashrcを次のように変更します。

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
-iそのbash に追加することもできます。
テディ

ええ、私は:)
ビルヴァイス

私がそれを行うと、新しいシェルでタブ補完が壊れます(「-i」を使用しても)-理由/修正方法はありますか?
コーダー

1
ここで新しい答えをテストしましたが、うまくいきます。少し荒いですが、動作します。
ビル・ワイス

7
ssh -tptyを割り当ててみてください。
追って通知があるまで一時停止します。

4

Pythonでこれを行うことに問題がない場合、pexpectには、あなたが求めていることとほぼ同じことを行う例があります。

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

ftpの代わりにsshでこれを行うには、次のようなコードが必要です(pexpectのサンプルファイルには詳細と情報がありますが、ここに基本があります)。

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

誤解しないでください、私は期待しています(特にautoexpect)が大好きですが、pythonは私にとって非常に簡単です。


私も期待から期待に移行しています。pythonは、はるかにユビキタスになりました。
JMベッカー

4

おそらく最も簡単でクリーンな方法でサーバーにsshし、インタラクティブシェルを生成し、そのシェル内でコマンドを実行するのは、bash用のカスタムrcファイルを作成することです。

サーバー上のカスタムbashrcファイルで、最初にデフォルトファイルを入手し、次にカスタムコマンドを追加します。例えば

〜/ .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

その後、次のようにSSHセッションを開始できます。

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

-tオプションは強制的に擬似tty割り当てを行うため、タブ補完などが機能します。

--rcfileオプションは、デフォルトのファイルの代わりにロードするrcfileを指定します。重要:認識されるためには、コマンドラインの単一文字オプションの前に「二重ダッシュ引数」を配置する必要があります。

-i/ bin / bashへの引数は、対話型シェルを呼び出すためにあります。


実際はそうではありません。接続ごとに異なるコマンドを実行する場合はどうすればよいですか?
オイゲンコンコフ

1

バックグラウンドで何が起きているかについての情報が必要な場合は、sshdマニュアルをご覧ください。

ユーザーが正常にログインすると、sshdは次のことを行います。

  1. ログインがttyであり、コマンドが指定されていない場合、最後のログイン時間と/ etc / motdを出力します(構成ファイルまたは〜/ .hushloginで防止されていない限り、FILESセクションを参照)。
  2. ログインがttyである場合、ログイン時間を記録します。
  3. / etc / nologinおよび/ var / run / nologinを確認します。存在する場合は、コンテンツを出力して終了します(ルートでない限り)。
  4. 通常のユーザー特権で実行するための変更。
  5. 基本的な環境を設定します。
  6. 〜/ .ssh / environmentファイルが存在する場合はそれを読み取り、ユーザーは環境を変更できます。sshd_config(5)のPermitUserEnvironmentオプションを参照してください。
  7. ユーザーのホームディレクトリへの変更。
  8. 〜/ .ssh / rcが存在する場合、それを実行します。または、/ etc / ssh / sshrcが存在する場合は実行します。それ以外の場合は、xauth(1)を実行します。`` rc ''ファイルには、標準入力でX11認証プロトコルとCookieが与えられます。以下のSSHRCを参照してください。
  9. ユーザーのシェルまたはコマンドを実行します。

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

通常、sshをこのような方法で使用することは、その目的に反するので避けるべきです。
やる

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

キーがsshアクティブセッションプールにリストされているかどうかを確認するか、自分で追加します(ssh-addを使用)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.