Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于自动OpenVPN登录的Bash脚本_Bash_Openvpn - Fatal编程技术网

用于自动OpenVPN登录的Bash脚本

用于自动OpenVPN登录的Bash脚本,bash,openvpn,Bash,Openvpn,我对bash脚本非常陌生,因此我为我的含糊不清提前道歉。我每天都需要连接不同数量的OpenVPN配置文件,我希望通过引入自动化使连接变得更容易 因此,我能够进入流程的授权部分,而这正是我陷入困境的地方: Your IP is xx.xx.xx.xx Mon Oct 13 09:57:14 2014 OpenVPN 2.2.1 i486-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payloa

我对bash脚本非常陌生,因此我为我的含糊不清提前道歉。我每天都需要连接不同数量的OpenVPN配置文件,我希望通过引入自动化使连接变得更容易

因此,我能够进入流程的授权部分,而这正是我陷入困境的地方:

  Your IP is xx.xx.xx.xx
Mon Oct 13 09:57:14 2014 OpenVPN 2.2.1 i486-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Jun 19 2013
Enter Auth Username:
我想知道如何使用bash使用我的用户名和密码自动登录。因此,脚本将填充并确认2个授权字段

输入Auth Username:Username

输入Auth密码:Password

然后,一旦填充并确认,我将连接到VPN

我感谢任何帮助,如果需要更多信息,请告诉我

我当前使用的脚本如下:

#!/bin/sh
expect_path="$(which expect)"
"$expect_path" "$0" "$@"

#!/bin/usr/expect -f

spawn sudo openvpn /root/Desktop/my.conf #Path to Openvpn config file (.ovpn)
expect -r "\[sudo\] .*\: " {
    send "my_ownpassword\n"
}
expect "Enter Auth Username:" {
    send "my_user\n"
}
expect "Enter Auth Password:" {
    send "my_vpnpassword\n"
}
interact
我收到的当前错误:

can't read "(which expect)": no such variable
    while executing
"expect_path="$(which expect)""
    (file "./vpn.sh" line 2)
./vpn.sh: 7: ./vpn.sh: spawn: not found
expect: invalid option -- 'r'
usage: expect [-div] [-c cmds] [[-f] cmdfile] [args]
./vpn.sh: 9: ./vpn.sh: send: not found
./vpn.sh: 10: ./vpn.sh: Syntax error: "}" unexpected
有关用于以编程方式控制OpenVPN实例的TCP协议的文档,请参阅

从bash使用可能如下所示:

#!/bin/bash
# the above shebang is necessary; much of this will not work with /bin/sh
# also, /dev/tcp support is optional functionality at compile time; be sure your bash
# supports it, or you might need to rewrite using netcat.

# Assuming you start OpenVPN with at least the options:
#   --management 127.0.0.1 3030
#   --management-query-passwords

# connect to OpenVPN management socket on FD 3
exec 3<>/dev/tcp/127.0.0.1/3030

pk_password=secret1 # private key password
username=squirrel   # username
password=secret2    # auth password paired with username

# read anything it sends
while read -r -u 3; do
  # if it asks for a password, then give it one
  if [[ $REPLY = ">PASSWORD: Need 'Private Key' password" ]]; then
    echo 'password "Private Key" '"$pk_password" >&3
  elif [[ $REPLY = ">PASSWORD: Need 'Auth' username/password" ]]; then
    echo 'username "Auth" '"$username" >&3
    echo 'password "Auth" '"$password" >&3
  else
    echo "Ignoring message: $REPLY" >&2
  fi
done
#/bin/bash
#这是必要的;这在很大程度上不适用于/bin/sh
#另外,/dev/tcp支持是编译时的可选功能;确保你的狂欢
#支持它,或者您可能需要使用netcat重写。
#假设您至少使用以下选项启动OpenVPN:
#--管理127.0.0.1 3030
#--管理查询密码
#连接到FD 3上的OpenVPN管理套接字
exec 3/dev/tcp/127.0.0.1/3030
pk_password=secret1#私钥密码
用户名=松鼠#用户名
密码=secret2#认证密码与用户名配对
#阅读它发送的任何内容
而read-r-u3;做
#如果它需要密码,那么就给它一个
如果[[$REPLY=“>密码:需要“私钥”密码”];然后
回显“密码”私钥“$pk_密码”>&3
elif[$REPLY=“>密码:需要“Auth”用户名/密码“];然后
回显'username“Auth'“$username”>&3
回显“password”Auth““$password”>&3
其他的
回显“忽略消息:$REPLY”>&2
fi
完成
所有这些——以明文形式存储用户名和密码是一个可怕的想法。如果您确实希望VPN安全,并且您没有用户可以输入他们知道的密码(而不是他们存储在计算机上的密码),那么您应该使用强私钥身份验证——理想情况下,该密钥存储在不允许读取的硬件令牌上,而不是(弱的、轻微的被盗)密码


当然,由于这个问题的前提是你愿意做愚蠢、不安全的事情,你也可以让自己更容易做到:

使用
ENABLE\u PASSWORD\u SAVE
标志集(
configure--ENABLE PASSWORD SAVE
在UNIX上)重新编译OpenVPN,然后配置文件中的
--auth user pass
将接受文件名作为可选参数,给出存储用户名和密码的磁盘位置


这实际上比管理界面方法更安全,因为这意味着您不会将密码发送给在端口3030上设置服务的任何其他用户,假装是OpenVPN的管理界面。

由于无法使您的代码正常工作,我对其进行了一点编辑,现在可以正常工作了

#!/bin/bash
exec 3<>/dev/tcp/127.0.0.1/3030

username=xxxxxxxxx   # username
password=yyyyyyyyy   # auth password paired with username

# read anything it sends
while read -r -u 3; do

  if [[ $(echo $REPLY | grep ">PASSWORD:Need 'Auth' username/password") ]]; then
    echo "username \"Auth\" $username" >&3
    echo "password \"Auth\" $password" >&3
  else
    echo "Ignoring message: $REPLY" >&2
  fi
done
#/bin/bash
exec 3/dev/tcp/127.0.0.1/3030
用户名=XXXXXXXX#用户名
password=yyyyyyyy#验证密码与用户名配对
#阅读它发送的任何内容
而read-r-u3;做
如果[[$(echo$REPLY | grep“>密码:需要'Auth'用户名/密码]];然后
回显“username\”Auth\“$username”>&3
回显“password\”Auth\“$password”>&3
其他的
回显“忽略消息:$REPLY”>&2
fi
完成

在Kali 2020.2上为我工作简单易行

#!/usr/bin/expect -f

# automatic openvpn login
spawn sudo openvpn FILE.ovpn

# script will enter username/password automatic. 
expect "Enter Auth Username:" 
send "USERNAME\n" 

 "Enter Auth Password:" 
send "PASSWORD\n"

interact
结束脚本
在存储file.ovpn的映射中保存并运行文件。

什么操作系统?如果您有
NetworkManager
(据我所知,大多数GNU/Linux台式机都有),您可以将连接信息存储在其数据库中,然后只需从脚本中使用
nmcli con-up-id VPN-id
。通常这将是
expect
(或python或perl的类似模块之一)的工作。但是,这仍然是一个丑陋的解决方案。我目前正在使用Kali的一个实例来测试和实现脚本。我正在查看expect命令,但它似乎没有正确利用。@FatalError,一般来说,是的,但不是专门针对OpenVPN,它有许多选项,可以避免在终端提示用户。希望我确切地知道修复方法是什么——您所做的许多更改真的很不幸。(例如,
echo$REPLY | grep…
将以glob的形式评估
REPLY
中的所有内容,因此如果您的回复包含一个
*
作为单词,它将被替换为当前目录的内容;它也比使用bash的内置字符串匹配慢得多,因为在子shell中设置管道需要至少至少两个
fork()
s和一个
execv()
——在大多数情况下,三个
fork()
s)…而且,您使用的是
#/bin/sh
shebang,但是您的许多代码都不能与基线POSIX shell一起工作,例如
ash
dash
。例如,使用
read
REPLY
作为默认目的地是bashism;
[[]]
也是如此(实际上,
/dev/tcp
作为一个整体是一种巴什主义,所以
#!/bin/sh
绝对不是这份工作的合适人选)。