如何将pick.sh随机选择的文件结果传入OpenVPN命令?
如何让OpenVPN使用pick.sh随机选择的OVPN配置文件
嘿,我来帮你搞定这个需求!首先咱们得先把你的pick.sh脚本调整得更健壮(毕竟原脚本在处理带空格的文件名时会出问题),然后再把它的输出正确传给OpenVPN命令。
第一步:修正你的pick.sh脚本
原脚本存在几个小问题:比如用ls生成文件列表容易踩特殊文件名的坑、IFS设置错误,还有没处理目录里没有OVPN文件的情况。下面是优化后的版本,专门针对OVPN文件做了适配:
#!/bin/bash # 随机选择指定目录下的一个OVPN文件并输出其路径 # 默认使用当前目录下的openvpn文件夹,也可以通过参数指定目录,比如 ./pick.sh /path/to/ovpn-files DIR="${1:-./openvpn}" # 开启nullglob:如果目录下没有匹配的OVPN文件,数组会是空的 shopt -s nullglob # 只收集目录下的.ovpn文件到数组里,避免选中其他无关文件 file_matrix=("${DIR}"/*.ovpn) # 关闭nullglob恢复默认行为 shopt -u nullglob # 检查是否找到OVPN文件 num_files=${#file_matrix[@]} if [[ $num_files -eq 0 ]]; then echo "错误:在目录 ${DIR} 中没有找到任何.ovpn文件" >&2 exit 1 fi # 随机挑选一个文件,输出其路径 selected_file="${file_matrix[$((RANDOM % num_files))]}" echo "$selected_file"
给脚本加上执行权限:
chmod +x pick.sh
第二步:将pick.sh的输出传入OpenVPN命令
最直接可靠的方式是用命令替换($()),它会把脚本的输出作为参数传给openvpn命令。记得加上双引号,这样带空格的文件名也能正确处理:
openvpn --config "$(./pick.sh)"
如果你的OVPN文件目录不是默认的./openvpn,可以直接给pick.sh传目录参数:
openvpn --config "$(./pick.sh /home/your-user/ovpn-configs)"
额外提示
- 这个方案在Qubes OS和Pop!_OS上都能正常工作,因为两者都是基于Linux的系统,bash脚本的行为一致。
- 如果你的OpenVPN需要其他参数(比如用户名密码文件),直接加在命令后面就行,比如:
openvpn --config "$(./pick.sh)" --auth-user-pass credentials.txt
内容的提问来源于stack exchange,提问作者user9781389
相关产品推荐
相关产品推荐

