Bash機能を実行するために "at"コマンドを使用できますか?

Bash機能を実行するために

スケジュールされた時間にBash機能を実行したいです。正しいツールはatコマンドだと思います。

しかし、うまくいかないようです。

function stupid () {
    date
}

export -f stupid

cat << EOM | at now + 1 minute
stupid
EOM

しばらく待ってからメールを確認しましたが、次のエラーが表示されました。

sh: line 41: syntax error near unexpected token `=\(\)\ {\ \ date"
"}'
sh: line 41: `"}; export BASH_FUNC_stupid()'

特に関数が機能していることを知っているので、ここで何が間違っているのかわかりません。

$ stupid
Fri May 29 21:05:38 UTC 2015

エラーを見ると、関数の実行に間違ったシェルが使用されているようですが(sh代わりにbash)、確認してみると を指すように$SHELL見え、/bin/bashマニュアルページに次のようにat示されています。

$ echo $SHELL
/bin/bash
$ man at

    ...

    SHELL   The value of the SHELL environment variable at the time
           of at invocation will determine which shell is used  to
           execute  the at job commands.

したがって、Bashは私の機能を実行するシェルでなければなりません。

どうなりますか?私のBash機能を一緒に実行する方法はありますかat

ベストアンサー1

Bash機能は環境を介してエクスポートされます。このatコマンドは、環境を再現するシェルコードを生成し、呼び出しプロセスの環境、umask、および現在のディレクトリをスクリプトで使用できるようにします。 at ジョブで実行されるスクリプトは次のとおりです。

#!/bin/bash
umask 022
cd /home/nick
PATH=/usr/local/bin:/usr/bin:/bin; export PATH
HOME=/home/nick; export HOME
stupid

()以前のバージョンのbashでは、関数名と関数を定義したコードで始まり、設定された値を含む変数に関数をエクスポートしました。

stupid="() {
    date
}"; export stupid

これにより、多くのシナリオがセキュリティの脆弱性に対して脆弱になります。シェルショックバグ(で見つかりましたスティーブン・チャジェラス)を使用すると、誰でも任意の名前で環境変数の内容を注入して、bashスクリプトから任意のコードを実行できます。 Shellshockの修正を含むbashバージョンは異なるアプローチを使用します。名前に環境変数で見つからない文字を含む変数に関数定義を格納し、シェルはそれを割り当てとして解析しません。

BASH_FUNC_stupid%%="() {
    date
}"; export stupid

これは有効な sh 構文ではないため、%bash でも at 操作は関数を使用するかどうかに関係なく失敗します。これat の Debian バージョンは多くのLinuxディストリビューションで使用されています。変更バージョン3.16では、シェルスクリプトに有効な名前を持つ変数のみがエクスポートされます。したがって、atの最新バージョンはShellshockの後ろからbashを介して機能をエクスポートしませんが、古いバージョンは失敗します。

Shellshock 以前のバージョンの bash を使用しても、エクスポートされた機能は、at ジョブ自体ではなく at ジョブで開始された bash スクリプト内でのみ機能します。 atジョブ自体内では、bashによって実行されてもstupidbashは起動時にのみ機能を取得する別の環境変数です。

関数をatジョブとしてエクスポートするには(bashまたはバージョンに関係なく)、その関数をファイルに入れ、ジョブからファイルを取得するか、ジョブに直接含めます。定義されたすべての関数を読み取り可能な形式で印刷するには、を使用しますdeclare -f

{ declare -f; cat << EOM; } | at now + 1 minute
stupid
EOM

おすすめ記事