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")