我在脚本中有这个命令。
sudo openvpn --config ....
执行时会询问用户名,然后输入密码。 是否可以在脚本中存储用户名?
换句话说,每次执行此脚本时都要避免输入?
(我正在使用Linux Ubuntu)
答案 0 :(得分:2)
使用配置指令
auth-user-pass filename
...其中filename
是第一行有用户名的文件,第二行是密码。 (如果您不希望密码曾经触摸过磁盘,则此密码可以是脚本通过用户输入传递的套接字。)
例如:
#!/bin/bash
# ^- IMPORTANT: use bash, not /bin/sh
# clearing IFS and using read -r makes trailing whitespace, literal backslashes, etc. work.
username="hardcoded value"
IFS= read -r -p "Password: " password
openvpn \
--config file.ovpn \
--auth-user-pass <(printf '%s\n' "$username" "$password")
使用printf
- 内置函数 - 在这里很重要:当只调用builtins时,参数不会放在argv上(因此可以访问系统上任何检查进程列表的内容)。
或者,您可以使用management-query-passwords
指令[或--management-query-passwords
命令行选项]来允许通过管理套接字请求和输入用户名和密码(此协议has its own extensive documentation )。
答案 1 :(得分:0)
我相信这是可能的。您已使用管道|
并在可能的情况下将用户名管道输出到脚本。我在C ++中使用了一个命令,如果我记得正确,则更改用户的密码。它看起来像:
sprintf(command, "echo -e \"%s\n%s\" | passwd %s",password,password,user);
所以,既然这是一个shell,我猜你可以这样做:
echo -e '<username>\n<password>\n' | YourScript
在您的情况下,这可能有效:
echo -e `<username>\n<password>\n | sudo openvpn --config...
当然,这假设没有其他要求的东西。这也是未经测试的。 Read more on piping here
修改强>
如Charles Duffy所述,上述内容仅适用于XSI扩展系统和不依赖TTY的程序。我仍然不是100%肯定,但我准备printf
是交叉兼容的,script -c
可以用来管道tty。 Here is the information on the script command。但是,在CentOS7中尝试它,它看起来会起作用:
printf '%s\n' "username" "password" | script -c "sudo openvpn --config..."
注意:我只尝试过管道到su
,并且在POSIXLY_CORRECT设置为1之后就可以了。
另外,我想我可能误解了你想要做的事情。如果您想在脚本的持续时间内存储用户名和密码,您可以执行以下操作:
printf "Input username:"
read username
printf "Input password:"
read -s password
printf '%s\n' "$username" "$password" | script -c "sudo openvpn --config..."