web-dev-qa-db-ja.com

spawnコマンドがubuntu 14.04に見つかりません

私は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

同じことについて何か考えはありますか?

3
Nullpointer

spawnexpect固有のコマンドです。つまり、spawnを使用してexpectを解釈する必要があります。

ほとんどの場合、expectスクリプトを使用し、その中にspawnを使用して新しいプロセスを開始します。

例えば:

#!/usr/bin/expect -f
spawn ssh Host
expect ....

ターミナルから直接:

% expect -c 'spawn whoami'
spawn whoami

デフォルトでは、spawnはコマンドをエコーするため、端末の出力になります。

6
heemayl

この場合、hosts_options(5)のmanページ(hosts.allow)のRUNNING OTHER COMMANDSセクションで説明されているように、spawnman 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しません

2
steeldriver