自动化shell脚本以登录vpn传递sudo -S

时间:2016-02-02 16:43:59

标签: python linux bash shell pexpect

每次离开办公桌时我都必须重新登录我的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密码?谢谢

1 个答案:

答案 0 :(得分:3)

openconnectsudo都可以在标准输入上输入密码。那两个怎么办?创建一个脚本:

#!/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" /> }

引用它