SSH リモートコマンドを「bash_history」に書き込みます。

SSH リモートコマンドを「bash_history」に書き込みます。

sshSSHを使用すると、最後の使用法に示すように、リモートユーザーはサーバーに対話的にログインしなくても特定のコマンドを実行できます。

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport] [-Q protocol_feature]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

リモートコマンドを使用してsshを呼び出すと、ファイルは更新.bash_historyされません(つまり、リモートコマンドはファイルに追加されません.bash_history)。私は以下を追加してこの効果を「シミュレート」しました/etc/ssh/sshd_config

ForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "$SSH_ORIGINAL_COMMAND\n" >> .bash_history; bash -c "$SSH_ORIGINAL_COMMAND"; fi

上記のコマンドは、環境変数が空で$SSH_ORIGINAL_COMMANDあることを確認します。

  • その場合、リモートコマンドは実行されず、単にbash
  • それ以外の場合は$SSH_ORIGINAL_COMMAND追加され、.bash_historyその中のリモートコマンドが実行されます。$SSH_ORIGINAL_COMMAND

.bash_history期待どおりに動作しますが、もっと必要です。現在のタイムスタンプも追加したいです。これを行うには、次のコマンドを追加しました/etc/ssh/sshd_config

ForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "#`date +%s`\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history; bash -c "$SSH_ORIGINAL_COMMAND"; fi

sshただし、サーバーに接続しようとすると、次のエラーが発生します。

bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file
Connection to 127.0.0.1 closed.

#以前に削除するとdate +%s正常に動作します。ただし、タイムスタンプは正しいファイル形式#なので、これより前に印刷する必要があります。.bash_history

ベストアンサー1

inはコメントの始まりとして解釈され、その後のすべての内容は無視されます#sshd_config(によるとsshd_config(5))は、""スペースを含む引数を引用するために使用できますが、引用しません#

これはまた、あなたが受け取っているエラーについても説明します。sshd次の項目だけを渡してくださいbash

if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "

"コマンドラインが最初の行の後に終了するため、2行目が見つかりません。

#この動作を回避するには、テキストを使用しないでください。

  • とにかく、printfここで使用されているように、バックスラッシュを使用して文字をエスケープする機能を使用することは非常に便利です。 (16進数)、(8進数)、(Unicode、16進数4桁の16進数)、または(Unicode、16進数8桁の16進数)#として使用できます。にも適用されます。引用符で囲む必要があるので、またはを使用してください。\x23\43\u23\U23echo -e\"\43"'\43'\\43

  • echoまたは、必要がない場合(でも機能します)printfに置き換えることができます。bashたとえば、何をすべきかを書くことができます。値が許容される最大桁数(8進数は3、16進数は2、Unicodeはそれぞれ4または8)より小さい場合は、誤解を避けるためにゼロを使用する必要があります。例:whileを計算すると、予想値が表示されます。zsh$'string'touch foo#bartouch $'foo\x23bar'$'foo\u23bar'foo⎺r$'foo\u0023bar'foo#bar

  • #すべての機能をスクリプトに入れてから、設定に入れてForceCommand /path/to/script(文字通りまたは他の方法で)一緒に使用しないでください。

printf2番目のオプションを使用すると、書式設定オプションをより広く使用して削除することもできますdate。変える

printf "\x23`date +%s`\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history

書くことができます

date $'+\x23%s'"${SSH_ORIGINAL_COMMAND//%/%%}" >> .bash_history

おすすめ記事