我已经写了一些bash脚本,但这超出了我的能力范围,我不知道从哪里开始。我在跑徐本图。我使用的是一个VPN,它允许我转发一个转发的端口,但只能通过运行下面的行,每次都使用不同的端口,该行会产生下面的输出。
Command:
./port_forward.sh user password
Output:
Loading port forward assignment information..
{"port:58661}
我想制作一个脚本,运行该进程,获取端口输出,然后将其放入Deluge的配置文件中,然后运行Deluge。我已经在下面粘贴了我当前的配置,32157的两个实例需要更改为新的端口。这个文件位于/home/user/.config/flood/core.conf
{
"file": 1,
"format": 1
}{
"info_sent": 0.0,
"lsd": true,
"send_info": false,
"move_completed_path": "/media/sf_Storage2/Download folder",
"enc_in_policy": 1,
"queue_new_to_top": false,
"ignore_limits_on_local_network": true,
"rate_limit_ip_overhead": true,
"daemon_port": 58846,
"natpmp": true,
"max_active_limit": 8,
"utpex": true,
"max_active_downloading": 5,
"max_active_seeding": 0,
"allow_remote": false,
"max_half_open_connections": 50,
"download_location": "/media/sf_Storage2/Temp Download Folder",
"compact_allocation": false,
"max_upload_speed": -1.0,
"cache_expiry": 60,
"prioritize_first_last_pieces": false,
"auto_managed": true,
"enc_level": 2,
"max_connections_per_second": 20,
"dont_count_slow_torrents": true,
"random_outgoing_ports": true,
"max_upload_slots_per_torrent": -1,
"new_release_check": false,
"enc_out_policy": 1,
"outgoing_ports": [
0,
0
],
"seed_time_limit": 180,
"cache_size": 512,
"share_ratio_limit": 2.0,
"max_download_speed": -1.0,
"geoip_db_location": "/usr/share/GeoIP/GeoIP.dat",
"torrentfiles_location": "/home/user/Downloads",
"stop_seed_at_ratio": false,
"peer_tos": "0x00",
"listen_interface": "",
"upnp": true,
"max_download_speed_per_torrent": -1,
"max_upload_slots_global": 4,
"enabled_plugins": [],
"random_port": false,
"autoadd_enable": false,
"max_connections_global": 200,
"enc_prefer_rc4": true,
"listen_ports": [
32157,
32157
],
"dht": true,
"stop_seed_ratio": 2.0,
"seed_time_ratio_limit": 7.0,
"max_upload_speed_per_torrent": -1,
"copy_torrent_file": false,
"del_copy_torrent_file": false,
"move_completed": true,
"proxies": {
"peer": {
"username": "",
"password": "",
"type": 0,
"hostname": "",
"port": 8080
},
"web_seed": {
"username": "",
"password": "",
"type": 0,
"hostname": "",
"port": 8080
},
"tracker": {
"username": "",
"password": "",
"type": 0,
"hostname": "",
"port": 8080
},
"dht": {
"username": "",
"password": "",
"type": 0,
"hostname": "",
"port": 8080
}
},
"add_paused": false,
"max_connections_per_torrent": -1,
"remove_seed_at_ratio": false,
"autoadd_location": "/home/user/Downloads",
"plugins_location": "/home/user/.config/deluge/plugins"
}
这可能吗?如果有一种方法可以使用该命令的输出,我想我可以将给定的端口号存储在一个单独的文件中,然后脚本将使用该文件来查找并替换为新的端口号,然后在下一次运行时更改文件中的端口号。
ETA:
谢谢!我不太确定你是怎么说我会得到新的端口的,所以我想出了这个:
#!/bin/bash
OLDPORT=`cat core.conf | grep -A2 listen_ports | tail -n1`
A=$(~/port_forward.sh user password)
B=$(echo -e "$A" | sed -n '2p')
PORT=`echo $B| cut -c9-13`
sed -i 's/'$OLDPORT'/'$PORT'/g' "core.conf"
deluge-gtk %U
它是有效的,尽管我确信有更干净的方法可以做到这一点。如果有一种方法可以简单地获取port_forward.sh命令输出中包含的任何5位数,并将其作为变量,我会很感兴趣。显然,我上面的内容并不理想,如果输出发生任何变化,就会中断。是的,它确实只有一个双引号,不知道为什么。
ETA2:没关系,我想好了。再次感谢您的帮助!
#!/bin/bash
OLDPORT=`cat core.conf | grep -A2 listen_ports | tail -n1`
PORT=$(~/port_forward.sh user password| grep -o "[0-9][0-9][0-9][0-9][0-9]")
sed -i 's/'$OLDPORT'/'$PORT'/g' "core.conf"
deluge-gtk %U
例如,您可以使用sed将旧端口号更改为新端口号。
sed 's/32157/58661/g' core.conf > core.new
mv core.new core.conf
sed会将旧端口号更改为新端口号,并将输出重定向到名为core.new的新文件,然后mv会用新端口号覆盖旧文件。
您也可以在脚本中执行此操作,只需将旧端口和新端口设置为变量即可。
要将旧端口作为变量,可以执行类似的操作。
oldport=`cat core.conf | grep -A2 listen_ports | tail -n1`
这将抓取core.conf文件,查找listen_ports字符串并打印它,之后的两行和尾部将获得最后一行,这将是端口号,当然,考虑到总是两个端口号。
要获得新端口,您可以将其作为脚本的第一个参数进行传递,因此您将获得类似的内容。
#!/bin/bash
oldport=`cat core.conf | grep -A2 listen_ports | tail -n1`
sed 's/$1/$oldport/g' core.conf > core.new
mv core.new core.conf
port_forward.sh的输出是否正确?看起来好像少了一个双引号。不应该是那样的吗。
{"port:58661"}
您还可以使用awk从该输出中获取端口值。
您可以使用参数扩展/子字符串提取来清理它。请尝试以下操作。它消除了大量的第三方应用程序调用以及它们产生的子shell。我没有你的port_forward.sh
脚本来测试确切的输出,但以下内容应该基于你发布的内容:
#!/bin/bash
OLDPORT=`grep -A2 listen_ports core.conf | tail -n1`
A=$(~/port_forward.sh user password)
tmp=${A##*port:}
PORT=${tmp%}*}
sed -i 's/'$OLDPORT'/'$PORT'/g' "core.conf"
deluge-gtk %U
注意我是如何重新排列您的OLDPORT
行的。尽量避免所有UUoC(不必要地使用cat
)。如果你发现自己在做cat something |
,这应该告诉你有一种更合适的方法。通常是直接给出文件名,使用重定向,或使用herestring或重定向子shell的输出。。。这只需要练习。