Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 脚本命令要求输入用户名。我可以把它存储在脚本中吗?_Shell - Fatal编程技术网

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

Shell 脚本命令要求输入用户名。我可以把它存储在脚本中吗?,shell,Shell,我在脚本中有这个命令 sudo openvpn --config .... 当它被执行时,它要求输入用户名,然后输入密码。 是否可以在脚本中存储用户名 换句话说,避免每次执行此脚本时都键入它 (我正在使用Linux Ubuntu)我相信这是可能的。如果可能,您可以使用管道|并将用户名管道到脚本开头。我使用C++中的命令,如果我记得正确的话,请更改用户的密码。它看起来像: sprintf(command, "echo -e \"%s\n%s\" | passwd %s",password,pas

我在脚本中有这个命令

sudo openvpn --config ....
当它被执行时,它要求输入用户名,然后输入密码。 是否可以在脚本中存储用户名

换句话说,避免每次执行此脚本时都键入它


(我正在使用Linux Ubuntu)

我相信这是可能的。如果可能,您可以使用管道
|
并将用户名管道到脚本开头。我使用C++中的命令,如果我记得正确的话,请更改用户的密码。它看起来像:

sprintf(command, "echo -e \"%s\n%s\" | passwd %s",password,password,user);
所以,既然这是一个外壳,我想你可以这样做:

 echo -e '<username>\n<password>\n' | YourScript
注意:我只尝试将管道连接到
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..."

使用配置指令

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")
#/bin/bash
#^-重要提示:使用bash,而不是/bin/sh
#清除IFS并使用read-r可以使尾随空格、文字反斜杠等起作用。
username=“硬编码值”
IFS=读取-r-p“密码:”密码
openvpn\
--config file.ovpn\

--auth user pass只需创建一个包含用户名的变量,并在脚本中使用它:
user=bob
,然后在需要的地方使用变量
$user
。我想你也可以直接将该信息放入openvpn配置中。@EtanReisner,…嗯,有点。出于充分的理由,OpenVPN不鼓励任何将凭据直接放在命令行上的行为,并且命令行和配置文件格式彼此完全等效。行为良好的程序会从TTY而不是stdin提示安全敏感信息。此外,OpenVPN还具有接收用户名和密码的带外方式……此外,不必要地使用
echo-e
也是不好的形式。如果密码包含文字反斜杠怎么办
echo-e
会吃掉它。@CharlesDuffy我同意它可能不是最优的。然而,我会争论,如果他们硬编码的值,他们应该或会知道,如果他们想要一个字面上的反斜杠,他们会使用“\\”,正如所提到的。我对Linux不是非常熟悉,所以我还在研究另一点。请看,特别是应用程序使用部分——您所依赖的
echo
行为直接与POSIX标准相矛盾。是的,GNU违反了标准(如果存在
-e
,GNU的行为就好像它是一个XSI扩展的POSIX系统,而非XSI系统则没有)——但是标准的普通阅读需要
echo-e
逐字打印
-e
…顺便说一句,如果
POSIXLY\u CORRECT=1
(一个几乎被命名为POSIX_ME_HARDER
的环境变量,没有人在RMS的幽默感中占主导地位)如果设置在环境中,GNU coreutils echo将作为一个非XSI、兼容POSIX的实现,按字面意思打印
-e
;尝试运行
POSIXLY_CORRECT=1/bin/echo-e'hello\nworld'
。一些UNIX系统将立即执行相同的操作;其他系统则不会;目睹依赖
echo
的危险。我不明白为什么我必须使用IFS命令。当我这样做时,系统会两次提示我输入用户名和密码。@caa,这是一个
read
命令,而不是
IFS
命令,从用户那里获取值;
IFS
改变了
read
的工作方式,修复了对带有尾随空格的值的支持。总之,您可以从任何地方——如果您想硬编码用户名,但提示输入密码,只需将
username=foo
放在
read
的位置,并保留用于输入密码的密码。如果您想从文件或串行端口获取密码,或者,好的,不管怎样——这是您要进行的编辑。:)好的,首先谢谢!我试着这么做,但一个“获取错误”无法启动TUNSETIFF点击:另一个问题。如果我在脚本中硬编码vars,为什么需要auth user pass文件?
Re:TUNSETIFF
错误,听起来好像你没有使用
sudo
。如果您没有将
sudo
放在此脚本前面,请将其放在脚本中:
sudoopenvpn…
auth-user-pass 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")