如何在shell脚本中输入密码?

时间:2012-02-20 09:08:03

标签: linux shell scripting expect

在shell脚本文件中,我使用的是scpmake install等要求输入密码的命令。

我运行一个shell脚本来编译一个大项目,一段时间后它要求我使用scp的密码。我需要等待那个过程并在那之后给出密码。

我只想在没有交互的情况下通过shell脚本完成所有操作,那么如何避免在此处提示输入密码?

5 个答案:

答案 0 :(得分:8)

简短回答:不要

使用public key authentication用于SCP,sudoNOPASSWD指令进行make install

答案 1 :(得分:5)

我认为对generate an authentication key更好一点,并使用这种基于密钥的身份验证,而不是在脚本中编写纯文本密码。

答案 2 :(得分:4)

如果您不能使用ssh信任并且必须稍后在脚本中输入密码,请使用read -s -p "Password:" USER_PASSWORD以静默方式读入密码。然后,您可以export USER_PASSWORD到期望脚本,避免它显示在ps

    #!/usr/bin/expect -f
    spawn scp some.file USER@otherhost:~
    expect "assword:"
    send -- "$env(USER_PASSWORD)\r"
    expect eof

答案 3 :(得分:2)

不,你找不到任何使用SSH配置文件或命令行选项来密码硬编码的方法,我确信这是设计的。

如果你的环境使这很困难,也许知道脚本可以使用-i参数指定一个身份文件是有帮助的,所以你不必拥有一个完整的主目录设置或类似的东西。还有其他选项可以帮助您使用ssh真正鼓励通过密码身份验证的密钥身份验证。

如果您在几个不想创建密钥并将其复制到服务器的用户中使用此功能,那么您也可以编写脚本。检查现有密钥并进行快速测试以确定是否可以与其建立连接并不困难。如果您不能没有密码,那么您将ssh-copy-id发送到服务器,要求一次性和脚本开头的ssh密码,这样在启动和运行脚本之间会出现很小的延迟只会一次。您甚至可以为每个用户设置一个单独的密钥,仅用于他们自己的〜/ .script / key /目录中的脚本,这样就不会阻止用户访问SSH服务器。

如果您想真正限制该用户可以在远程服务器上执行的操作,可以使用rssh作为远程帐户的shell,这将限制用户访问传输文件。

答案 4 :(得分:1)

我们过去这样做的一个好方法就是在使用基于密钥的身份验证时为所需脚本提供密码是不可能的或者需要使用密码来应用,服务,mysql,等等...我们将密码存储在加密文件中然后在运行时解密此文件以提供脚本的密码。

密码解密脚本,我们称之为yourcreds.rb,当然仅限于root用户,未加密的密码不会存储在任何地方。例如,您可以运行:

root @ host:〜#yourcreds.rb | grep mysql | awk {'print $ 3'}

没有awk会输出存储的行: 服务|用户|密码|描述|等等... mysql mysqluser密码....

使用yourcreds.rb(或其他),您只需输出密码,并可轻松将此方法合并到更大或更复杂环境中的脚本/ cron作业中。

另外如果我没记错,我们不必使用grep / awk或其他任何东西。我们只是在opts中解析了如下内容:yourcreds.rb list mysql或yourcreds.rb -l等。

我们使用blowfish和yamls存储加密密码。我相信你可以有创意。只要确保它是除了root之外的任何人的防弹。