每次离开办公桌时我都必须重新登录我的VPN,这很乏味。我试图传递shell的信息,但它没有按正确的顺序得到它。顺序是"尝试openconnect,如果需要输入sudo pw,然后输入用户名,然后输入密码"。 pexpect
会很好,因为它可以判断您是否需要sudo
密码,但是不起作用:
#!/usr/bin/env python
# coding: utf-8
import os, sys, subprocess, time, re, pexpect
from my_scripting_library import *
child = pexpect.spawn('sudo openconnect vpn.com')
# send sudo pw
child.expect('.*')
child.sendline(sudopw)
# send sn
child.expect('.*')
child.sendline('cchilders')
# send work pw
child.expect('.*')
child.sendline(vpnpw)
time.sleep(150)
以下是我手动执行这些步骤时的样子:
cchilders:~/scripts/work_scripts [master]$ sudo openconnect vpn.com
[sudo] password for cchilders:
POST https://vpn.com
Attempting to connect to server 555.555.55.55:555
Please enter your username and password.
Username:
Password:
当我尝试像以前一样用shell提供sudo
密码时,VPN会超时并说
与vpn.com进行SSL协商
服务器证书验证失败:证书与主机名
不匹配
我用
alias vpn='echo $MYPW | sudo -S openconnect vpn.com'
如何从shell / python脚本中连续发送我的sudo
密码,然后是我的用户名,然后是我的VPN密码?谢谢
答案 0 :(得分:3)
openconnect
和sudo
都可以在标准输入上输入密码。那两个怎么办?创建一个脚本:
#!/bin/sh
password=$(cat /my/very/secure/vpn/password.txt)
echo "$password" | /usr/sbin/openconnect --user codyc4321 --passwd-on-stdin
现在,使用sudo
:
pw=$(cat /my/very/secure/sudo/password.txt)
echo "$pw" | sudo -S vpn.sh
不言而喻,存储在文本文件中的密码很危险,需要使用适当的所有权和权限进行保护。如评论中所述,从sudo
中删除密码要求可以减少一半的风险,能够通过证书连接到VPN可以摆脱其余的。
编辑以通过告知pexpect
所有情况都假设.*
来添加您误导sudo
。如何提示是来自openconnect
还是expect
?我没有Python经验,但之前使用过--cafile
。它有some good examples在Python中的工作原理。
最后一次编辑提到您的证书错误与此无关,并且正在发生,因为您没有将VPN服务器的证书存储在您的可信证书中。将服务器证书保存到本地磁盘,并使用openconnect
参数@model test
@using (Html.BeginForm())
{
@Html.RadioButtonFor(model => model.Gender, true)
<span>Male</span>
@Html.RadioButtonFor(model => model.Gender, false)
<span>FeMale</span>
<input type="submit" />
}