脚本命令要求输入用户名。我可以将它存储在脚本中吗?

时间:2015-05-27 18:51:25

标签: shell

我在脚本中有这个命令。

sudo openvpn --config ....

执行时会询问用户名,然后输入密码。 是否可以在脚本中存储用户名?

换句话说,每次执行此脚本时都要避免输入?

(我正在使用Linux Ubuntu)

2 个答案:

答案 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..."