web-dev-qa-db-ja.com

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

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

リモートマシンにログインしてコマンドを実行し、切断しないスクリプトを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
30
jonathan

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

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

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

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

:)

25
Bill Weiss

サーバーに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を指定します。重要:認識されるためには、コマンドラインで1文字のオプションの前に「2つのダッシュの引数」を置く必要があります。

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

4
Danilo Bargen

Pythonでこれを行うことに問題がなければ、 pexpect には、求めていることをほぼ正確に実行する例があります。

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('[email protected]')
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の方が私にとって非常に簡単です。

4
Jed Daniels

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

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

  1. ログインがttyで行われ、コマンドが指定されていない場合は、最後のログイン時刻と/ etc/motdを出力します(構成ファイルで〜/ .hushloginを使用しない限り、「ファイル」セクションを参照してください)。
  2. ログインがtty上で行われた場合、ログイン時間を記録します。
  3. / etc/nologinおよび/ var/run/nologinをチェックします。存在する場合は、コンテンツを出力して終了します(rootを除く)。
  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

1
Gerry

Sshはその目的に反するため、通常、このような方法でのsshの使用は避けてください。

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

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

0
Kounavi