3

私は初心者でasterisk、助けが必要です。ダイヤル プランから実行し、返された値を取得してダイヤル プランの変数に入れる必要がある bash スクリプトがあります。

たとえば、私のbashスクリプトはtest.sh次のとおりです。

#! /bin/bash

echo "61"

私のダイヤル プラン:

exten => 3333,1,Set(result=${shell(/root/test.sh)}) 
exten => 3333,2,Verbose(result is: ${result})

スクリプトには 777 のアクセス許可があり、シェル コマンド ラインから手動で実行すると動作します。ダイヤルプランから実行し、戻り値を変数で使用したいのですが、何も返されません (値が返されません)

私のアスタリスクのバージョンはアスタリスク 1.6.2.20 です

4

5 に答える 5

4

アスタリスクがアスタリスクユーザーの下で実行されており、ルートディレクトリでスクリプトを読み取れないため、ダイヤルプランが機能しません。スクリプトの問題をトラブルシューティングするには、アスタリスクを停止し、コンソールで次のように開始することをお勧めします

asterisk -vvvgc 

そうすれば、スクリプトによって生成されたエラーが表示されます。

しかし

シェルの起動と agi スクリプトの起動では CPU コストに違いがないため、AGI スクリプトを使用することをお勧めします。

これを行うには、スクリプトを /var/lib/asterisk/agi-bin/ に置きます。

#!/bin/bash

echo 'SET VARIABLE result "61" '

ダイヤルプランは

exten => 3333,1,AGI(test.sh) 
exten => 3333,2,Verbose(result is: ${result})

ps のベスト プラクティスは、スクリプトをまったく使用しないことです。これは、シェルの起動が CPU コストの高い操作であり、うまくスケーリングできないためです。複雑なチェックやデータベースのクエリ/更新タスクを含め、ほとんどのタスクはダイヤルプランで実行できます。

于 2013-01-05T01:54:19.383 に答える
1

${SHELL(date)} を使用して、動作するかどうかを確認してください。

私の extensions.conf から:

exten => 4002,1,Answer
exten => 4002,n,Set(RESULT=${SHELL(date)})
exten => 4002,n,NoOp(${RESULT})
exten => 4002,n,Hangup

4002 での呼び出し後の asterisk.log から:

  == Using SIP RTP CoS mark 5
    -- Executing [4002@demo2:1] Answer("SIP/100-00000585", "") in new stack
    -- Executing [4002@demo2:2] Set("SIP/100-00000585", "RESULT=Thu Jan  3 20:00:08 EET 2013
") in new stack
    -- Executing [4002@demo2:3] NoOp("SIP/100-00000585", "Thu Jan  3 20:00:08 EET 2013
") in new stack
    -- Executing [4002@demo2:4] Hangup("SIP/100-00000585", "") in new stack
  == Spawn extension (demo2, 4002, 4) exited non-zero on 'SIP/100-00000585'*emphasized text*
于 2013-01-03T18:02:13.573 に答える
0

また、アスタリスクユーザーがシェルを持っていることも常に確認してください。

cat /etc/passwd | grep asterisk

私の場合、セキュリティ上の理由から /bin/false を使用しました。したがって、次のコマンドは機能しません。

su asterisk -c 'whoami'
于 2014-10-02T12:21:38.820 に答える
0

/etc/asterisk/ またはアスタリスクに権限がある他のフォルダーにスクリプトを作成します。

chown アスタリスク /folder

chgrp アスタリスク / フォルダー

また、次のようにコマンドを実行できることにも注意してください。

拡張 => 3333,1,Set(result=${shell(echo 61)})

于 2014-08-20T07:44:39.600 に答える
0

SELinux を有効にしていますか? 多くの場合、SELinux はこの種のシェル スクリプトへのアクセスをブロックします。

于 2013-01-03T19:28:47.243 に答える