2014-03-07 99 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密鑰仍然是最安全的選擇。 –