我有一个脚本用于为我安装的IP电话创建配置文件。现在我手动输入分机号码和手机的密码,然后输入MAC地址,以便正确创建输出文件。这很好。以下是我到目前为止的情况:
#!/bin/bash
echo "Enter the Extension #:"
read extension
echo "Enter the phone MAC Address:
read mac
echo " Extension Password:"
read password
cat >/tftpboot/$mac.cfg << EOF
#!version:1.0.0.1
account.1.label = $extension
account.1.display_name = $extension
account.1.auth_name = $extension
account.1.user_name = $extension
account.1.password = $password
account.1.sip_server.1.address = 10.1.10.250
account.1.sip_server.1.port = 5060
account.1.voice_mail_number= *97
account.1.subscribe_mwi = 1
local_time.time_zone = -4
local_time.ntp_server1 = 10.1.10.250
network.qos.rtptos = 46
network.qos.signaltos = 46
network.port.max_rtpport = 20000
network.port.min_rtpport = 10000
EOF
echo " All Done!"
我将拥有一个文件,该文件将包含运行此脚本的服务器上的所有秘密。以下是该文件的示例:
[100]
deny=0.0.0.0/0.0.0.0
secret=60770f7d87b72dd451dbfd2dd8143b2b
dtmfmode=rfc2833
canreinvite=no
context=from-internal
host=dynamic
trustrpid=yes
sendrpid=pai
type=friend
nat=yes
port=5060
qualify=yes
qualifyfreq=60
transport=udp
encryption=no
callgroup=
pickupgroup=
dial=SIP/100
mailbox=100@default
permit=0.0.0.0/0.0.0.0
callerid=100 <100>
callcounter=yes
faxdetect=no
cc_monitor_policy=generic
[101]
deny=0.0.0.0/0.0.0.0
secret=7c2166c495ccbb637ae43e63c47de435
dtmfmode=rfc2833
canreinvite=no
context=from-internal
host=dynamic
trustrpid=yes
sendrpid=pai
type=friend
nat=yes
port=5060
qualify=yes
qualifyfreq=60
transport=udp
encryption=no
callgroup=
pickupgroup=
dial=SIP/101
mailbox=101@default
permit=0.0.0.0/0.0.0.0
callerid=101 <101>
callcounter=yes
faxdetect=no
cc_monitor_policy=generic
分机号码在括号[100]中,秘密在下面两行。可能有100个或更多的扩展。理想情况下,我想运行escript并使用条形码扫描仪扫描每个电话的MAC地址。
感谢您的帮助。
答案 0 :(得分:0)
以下awk将读取文件并输出分机号码和密码
awk '{if ($0 ~ "\[[[:digit:]]\]") {gsub("\\[|\\]","");ext=$0} else if ($0 ~ "secret.*") {gsub("secret=","");print ext " " $1}}' file 2>/dev/null
<强>更新强>
假设将哪个电话(MAC)分配给分机和密钥无关紧要,
您可以在while
循环中使用它并将输出分配给两个不同的变量。如果要手动读取每对的MAC,即暂停执行并输入MAC,则必须在while
循环内执行此操作。但是,您不能只从STDIN
(fd0
)读取,因为STDIN
已读取awk
的输出。因此,来自fd0的read
只会从awk
的输出中读取下一个标记。这可以通过使用不同的文件描述符(在此示例中为fd3
)来修复,首先必须将其指向STDIN。这就是exec
的作用。现在,您可以在read
循环内fd3
while
,执行将停止,直到输入可用。
#!/bin/bash
exec 3<&0 # new file descriptor to read from stdin
file="$1"
while read -r extension password;do
echo -n "Input MAC address for extension ${extension}: "
read -u 3 mac # read from fd3 to allow for manual input
cat > "./${mac}.cfg" << EOF
#!version:1.0.0.1
account.1.label = $extension
account.1.display_name = $extension
account.1.auth_name = $extension
account.1.user_name = $extension
account.1.password = $password
account.1.sip_server.1.address = 10.1.10.250
account.1.sip_server.1.port = 5060
account.1.voice_mail_number= *97
account.1.subscribe_mwi = 1
local_time.time_zone = -4
local_time.ntp_server1 = 10.1.10.250
network.qos.rtptos = 46
network.qos.signaltos = 46
network.port.max_rtpport = 20000
network.port.min_rtpport = 10000
EOF
# ^ no leading whitespace before EOF allowed
done < <(awk '{if ($0 ~ "\[[[:digit:]]\]") {gsub("\\[|\\]","");ext=$0} else if ($0 ~ "secret.*") {gsub("secret=","");print ext " " $1}}' "${file}" 2>/dev/null )
exec 3<&- # close file descriptor
脚本需要带有扩展名和secret的文件名作为其第一个参数。您应该采取措施,以防意外点击Enter
,然后在输入MAC地址时跳过扩展/密钥对。