ssh
SSHを使用すると、最後の使用法に示すように、リモートユーザーはサーバーに対話的にログインしなくても特定のコマンドを実行できます。
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
\U23
echo -e
\
"\43"
'\43'
\\43
echo
または、必要がない場合(でも機能します)printf
に置き換えることができます。bash
たとえば、何をすべきかを書くことができます。値が許容される最大桁数(8進数は3、16進数は2、Unicodeはそれぞれ4または8)より小さい場合は、誤解を避けるためにゼロを使用する必要があります。例:whileを計算すると、予想値が表示されます。zsh
$'string'
touch foo#bar
touch $'foo\x23bar'
$'foo\u23bar'
foo⎺r
$'foo\u0023bar'
foo#bar
#
すべての機能をスクリプトに入れてから、設定に入れてForceCommand /path/to/script
(文字通りまたは他の方法で)一緒に使用しないでください。
printf
2番目のオプションを使用すると、書式設定オプションをより広く使用して削除することもできますdate
。変える
printf "\x23`date +%s`\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history
書くことができます
date $'+\x23%s'"${SSH_ORIGINAL_COMMAND//%/%%}" >> .bash_history