2014-03-07 65 views
0

我想让我的bash脚本将一个字符串写入标准输入流。我想让它通过我的密码git push命令。我已经尝试了以下三个选项,它们都没有工作:git问我密码。将字符串发送到bash脚本中的stdin

#!/bin/bash 

# 0 
git push origin master <<< 'password' 

# 1 
echo 'password' | git push origin master 

# 2 
git push origin master <<EOF 
password 
EOF 
+0

@devnull没有重复。 'git push'只是一个例子。我想知道为什么上述方法不起作用。 – Kolyunya

+2

@Kolyunya:如果'git push'只是一个例子,而不是一个糟糕的例子。它不起作用的原因是_git不要求在标准input_上输入密码。它询问(在ssh情况下实际上是ssh)它在控制终端上。这样可以将数据传递给远程命令并仍然在终端上输入密码。 –

回答

3

所有这三种方法都将字符串password␤传递给命令。

问题是命令没有从标准输入读取密码。它从控制终端读取它,即打开特殊文件/dev/tty并从那里读取。

在ssh传输的情况下,它实际上是ssh,询问密码,并按照上述方式进行(因此,这个讨论适用于任何其他基于ssh的ssh或工具)。在http传输的情况下,git以相同的方式执行。

的原因是双重的:

  1. 这样就可以重定向实际命令的输入和/或输出,并且还从键盘给密码,看到终端上的提示和
  2. 防止你正在尝试做的事情,出于安全原因而强烈建议不要这样做。

请参阅Git push: username, password, how to avoid?了解如何在不提供密码的情况下使用git remote命令。如果您坚持使用http,则Is there a way to skip password typing when using https:// on GitHub?Git http - securely remember credentials中的选项更安全。另见gitcredentials(7)

+0

我仍然可以将密码从我的bash脚本传递给'/ dev/tty',对吧? – Kolyunya

+0

@Kolyunya:不,你不能(至少不容易)。 '/ dev/tty'是一个特殊的文件,始终是进程的控制终端。有一些应用程序可以为像[expect](http://expect.nist.gov/)这样的进程提供自定义终端,但是有更简单的方式来使用没有密码的git或提供密码。 –

+0

@Kolyunya:我已经添加了一些链接,指向可以为git保存HTTP密码的其他解释。尽管如此,单一用途的ssh密钥仍然是最安全的选择。 –