【问题标题】:Send string to stdin in bash script [duplicate]在bash脚本中将字符串发送到标准输入[重复]
【发布时间】:2014-04-10 06:59:33
【问题描述】:

我希望我的 bash 脚本将字符串写入标准输入流。我希望它将我的密码传递给git push 命令。我尝试了以下三个选项,但都没有成功:git was ask me for the password.

#!/bin/bash

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

# 1
echo 'password' | git push origin master

# 2
git push origin master <<EOF
password
EOF

【问题讨论】:

  • @devnull 没有重复。 git push 只是一个例子。我想知道为什么上述方法不起作用。
  • @Kolyunya:如果git push 只是一个例子,那么它就是一个坏例子。它不起作用的原因是 git 不会在标准输入上要求密码。它在控制终端上询问(在 ssh 情况下实际上是 ssh)。这样您就可以将数据传递给远程命令,并且仍然在终端上提供密码。

标签: linux string git bash stdin


【解决方案1】:

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

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

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

原因有两个:

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

请参阅Git push: username, password, how to avoid? 了解如何使用 git 远程命令而无需每次都提供密码。如果你坚持使用http,Is there a way to skip password typing when using https:// on GitHub?Git http - securely remember credentials 中的选项更安全。另见gitcredentials(7)

【讨论】:

  • 我仍然可以从我的 bash 脚本中将密码传递给 /dev/tty,对吧?
  • @Kolyunya:不,你不能(至少不容易)。 /dev/tty 是一个特殊的文件,它始终是进程的控制终端。有一些应用程序可以为expect 之类的进程提供自定义终端,但是有更简单的方法可以在没有密码的情况下使用 git 或为其提供密码。
  • @Kolyunya:我添加了指向其他说明的链接,说明可以为 git 保存 HTTP 密码的位置。不过,单一用途的 ssh 密钥仍然是最安全的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2012-03-07
相关资源
最近更新 更多