私はUbuntu 14.04を使用していますが、GeoIPを使用してSSHログイン国ごとにブロックしたい(From https://www.axllent.org/docs/view/ssh-geoip/ )、
コマンドの出力を見つけてください:
$ spawn
spawn: command not found
expectパッケージをインストールしたが、まだ動作しないように:
apt-get install expect
expect is already the newest version
次のスクリプトを実行したい:
cat /etc/hosts.allow
sshd: ALL: spawn /usr/local/bin/sshfilter.sh %a
同じことについて何か考えはありますか?
spawn
はexpect
固有のコマンドです。つまり、spawn
を使用してexpect
を解釈する必要があります。
ほとんどの場合、expect
スクリプトを使用し、その中にspawn
を使用して新しいプロセスを開始します。
例えば:
#!/usr/bin/expect -f
spawn ssh Host
expect ....
ターミナルから直接:
% expect -c 'spawn whoami'
spawn whoami
デフォルトでは、spawn
はコマンドをエコーするため、端末の出力になります。
この場合、hosts_options(5)のmanページ(hosts.allow
)のRUNNING OTHER COMMANDS
セクションで説明されているように、spawn
はman hosts_options
構文のspawn
拡張を参照しているようです。
RUNNING OTHER COMMANDS
aclexec Shell_command
Execute, in a child process, the specified Shell command, after
performing the %<letter> expansions described in the
hosts_access(5) manual page. The command is executed with
stdin, stdout and stderr connected to the null device, so that
it won't mess up the conversation with the client Host. Example:
smtp : ALL : aclexec checkdnsbl %a
executes, in a background child process, the Shell command
"checkdnsbl %a" after replacing %a by the address of the remote
Host.
The connection will be allowed or refused depending on whether
the command returns a true or false exit status.
spawn Shell_command
Execute, in a child process, the specified Shell command, after
performing the %<letter> expansions described in the
hosts_access(5) manual page. The command is executed with
stdin, stdout and stderr connected to the null device, so that
it won't mess up the conversation with the client Host. Example:
spawn (/usr/sbin/safe_finger -l @%h | /usr/bin/mail root) &
executes, in a background child process, the Shell command
"safe_finger -l @%h | mail root" after replacing %h by the name
or address of the remote Host.
spawn
がそのコンテキストの外で(つまりシェルのコマンドとして)実行しようとするとエラーを返すという事実は、GeoIPフィルタリングスクリプトの適切な操作に問題がある場合は気にする必要はありません。別の問題。
GeoIPに絡まることなくUbuntu 14.04でhosts.allow spawn
拡張機能が正常に動作することを示すために、IPアドレスを記録するだけの最小限の実行可能ファイル/usr/local/bin/sshfilter.shスクリプトを作成し、次に0を返します。例えば.
#!/bin/sh
logger "$0: connection from $1"
exit 0
次に、hostsファイルに次の行を追加します。
Hosts.denyで:
sshd: ALL
Hosts.allowで:
sshd: ALL: spawn /usr/local/bin/sshfilter.sh %a
次に実行する
tail -f /var/log/syslog
1つの端末ウィンドウで、別のウィンドウでSSH経由でログインを試行します。
ssh localhost
Syslogの末尾に次のようなメッセージが表示されます。
Jul 25 08:03:59 T61p logger: /usr/local/bin/sshfilter.sh: connection from 127.0.0.1
リンクした記事で提案されているように、aclexec
の代わりにspawn
でも機能することを確認できます。 実際、この場合は、aclexec
を使用する必要があります。なぜなら、spawn
は、接続を許可するかどうかを判断するために、生成されたプロセスの終了コードを使用しないからです-which aclexec
しません。