Linux 从bash脚本启动Shrewsoft 总结

Linux 从bash脚本启动Shrewsoft 总结,linux,bash,vpn,Linux,Bash,Vpn,连接到Shrew soft vpn -终端——命令工作正常 -bash脚本--同一命令返回错误: “双重自由或腐败(外)” 问题 我经常使用shrewsoft vpn客户端连接到我的工作vpn。我想创建一个bash脚本,这样我就可以使用一个命令来设置vpn客户端以及一些其他环境变量。当我从终端运行命令时,它工作正常。但是bash脚本中的相同命令失败 终端命令 ikec -r "<shrewsoft vpn connection name>" -u "john" -p "<pas

连接到Shrew soft vpn
-终端——命令工作正常
-bash脚本--同一命令返回错误:

“双重自由或腐败(外)”

问题 我经常使用shrewsoft vpn客户端连接到我的工作vpn。我想创建一个bash脚本,这样我就可以使用一个命令来设置vpn客户端以及一些其他环境变量。当我从终端运行命令时,它工作正常。但是bash脚本中的相同命令失败

终端命令

ikec -r "<shrewsoft vpn connection name>" -u "john" -p "<password>" -a

我已经开始“sudo/usr/sbin/iked”。通过终端,我可以成功地连接和断开运行该命令的连接,但当我从bash脚本运行该命令时,会出现错误。

当shell脚本运行时,它会丢失您定义但未导出的所有环境变量。当您在sudo下运行脚本时,sudo会清除除少数变量之外的环境

可能是
ikec
依赖于缺少的环境变量,或者可能是脚本执行的
ikec
不相同,可能是因为路径更改或别名

顺便说一句,我不会用剧本。我会使用别名或函数。在您的
~/.profile
~/.bash\u profile
中(无论您使用哪个),尝试:


然而,关于文件中密码的评论中提出的观点是正确的。寻找一种无需提供密码即可连接到vpn的方法。如果不能,您可以将该选项从别名中删除,并让ikec提示您

#!bash
不是有效的shebang。必须是绝对路径,如
#/bin/bash
,允许从非shell进程调用——尽管这不是您现在遇到的问题;您应该与它的作者(在本例中是指Shrewsoft)在这方面进行合作。但是如果您想追踪C代码基于调用机制采用不同路径的原因,我将通过跟踪系统调用并查看它们的不同之处来实现这一点……您可以做的一件简单的事情是将
set-x
之后的工作终端命令的输出与运行
sudo bash-x./vpn\u connection.sh
发出的行进行比较,看看它们是否不同。例如,如果
-a
变成
$'-a\r'
,那么问题是您将脚本保存为DOS文本文件而不是UNIX文本文件;但是任何差异都是有用的。顺便说一句,如果在直接从终端运行客户端时不使用
sudo
,为什么要使用sudo来运行脚本?(另外,顺便说一句,在命令行上放置密码是一个非常糟糕的主意——命令行对操作系统上的每个进程都是公开的,包括由不同的/不受信任的用户运行的进程;即使程序在启动完成后遮住了它们的内容,在它们被公开之前仍然有一个窗口。坦率地说,接受这样的密码会让我对所讨论的开发人员的责任感/可信度感到犹豫)。有什么特别的原因推荐别名而不是函数吗?引用更复杂,实际上没有任何补偿优势。没有特别的原因,没有,尽管我实际上没有“推荐”它只是提供了一个例子。我想我使用的shell没有函数,并且支持别名。同意,引用函数更简单。函数是POSIX合规性所必需的(自1992年POSIX.2标准发布以来),而别名是可选用户可移植性扩展的一部分。因此,POSIX系列外壳(Bourne的后续系列中的外壳)比别名更可能支持功能。
> sudo bash ./vpn_connection.sh
alias vpn-connect='ikec -r "<shrewsoft vpn connection name>" \
      -u "john" -p "<password>" -a'
$ vpn-connect