Bash 如何让'make'提示用户输入密码并将其存储在Makefile变量中?
我正在编写一个Makefile,Makefile运行的一些命令需要密码。我想让用户能够使用Bash 如何让'make'提示用户输入密码并将其存储在Makefile变量中?,bash,makefile,Bash,Makefile,我正在编写一个Makefile,Makefile运行的一些命令需要密码。我想让用户能够使用makepassword=PASSWORD将其作为Makefile变量传入,或者如果用户没有传入,则提示用户输入,并将其响应存储在所述Makefile变量中 目前,我能够检查Makefile变量,然后作为特定于目标的规则的一部分,编写shell命令,提示用户输入密码并将其存储在shell变量中。但是,此变量仅适用于该特定shell,而不适用于任何其他shell 如何从用户处读取内容并将其存储在变量中 我尝试
makepassword=PASSWORD
将其作为Makefile变量传入,或者如果用户没有传入,则提示用户输入,并将其响应存储在所述Makefile变量中
目前,我能够检查Makefile变量,然后作为特定于目标的规则的一部分,编写shell命令,提示用户输入密码并将其存储在shell变量中。但是,此变量仅适用于该特定shell,而不适用于任何其他shell
如何从用户处读取内容并将其存储在变量中
我尝试了以下方法:
PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $pwd)
但提示从未打印。我还尝试了echo”密码:
在shell中,但也没有打印出来
有什么想法吗
编辑:
为了澄清这一点,需要为特定目标设置密码,因此我有如下内容:
PASSWORD :=
my-target: PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $$pwd)
my-target:
# rules for mytarget that use $(PASSWORD)
编辑2:
我发现了问题。当我在脚本顶部设置PASSWORD:=
时,它会将PASSWORD
设置为一个空字符串,这反过来会导致跳过?=
(因为PASSWORD
)已设置。有几件事:
- 取消引用shell变量
的pwd
由$
进行解释。您可以使用make
$$
正在调用shell作为与Posix兼容的make
,而不是/bin/sh
。因此,不支持读取的/bin/bash
选项-s
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
这在Ubuntu 12.04/GNU make 3.81/bash 4.2.25(1)上对我很有效
在OSX 10.8.5/make 3.81/bash 3.2.48(1)上:
要回答@joeb的问题:
$make;echo“--Makefile----”;cat生成文件
密码:
测试
测试
---生成文件---
全体:第一秒
密码?=$(shell读取-s-p“密码:”pass;echo$$pass)
定义格式化
第一:
@回声1美元
第二:
@回声1美元
恩德夫
$(eval$(调用格式,$(密码)))
什么命令需要密码?嘘?您可以改用ssh无密码登录吗?不,不是宋承宪。我需要对一个需要身份验证的服务运行curl 3次。curl可以提示输入自己的密码,但我不想强迫用户输入3次。我觉得Make变量中的明文密码可能容易被利用。我不知道如何利用它,但恶意用户可能很容易转储makefile变量(make-pn)并获取此密码。只是说,;-)该用户将是运行make并输入密码的同一用户,除非其他用户可以访问第一个用户运行的命令的内存空间。。。在这种情况下,所有的赌注都被取消了,你的操作系统也被完全破坏了。是的,如果这是一个curl
密码,我不知道还有什么方法可以处理它,除了你在做什么。我想我担心的最糟糕的情况是将来有人需要调试你的Makefile,并将make-pn
日志转储到某个磁盘上。然后恶意用户会在构建日志中看到明文密码。在MacOSX/GNU Make 3.81/bash 3.2.48上似乎不起作用。它拒绝打印提示。@bluesmoon-它在OSX上的工作方式似乎与我在Ubuntu上的工作方式相同。也许我遗漏了什么?我已经在答案中添加了我的测试生成文件和控制台日志。如果使用POSIX shell,则提供一个快速注释,以防止echo进入屏幕stty-echo
,并重新启用stty-echo
。快速问题,如果密码在多个位置使用,如何让make
不多次询问密码?@joeb请参见下面我的答案:
$ cat Makefile
PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd')
all:
echo The password is $(PASSWORD)
$ make
Password: echo The password is 1234
The password is 1234
$
PASSWORD ?= $(shell stty -echo; read -p "Password: " pwd; stty echo; echo $$pwd)
$ make; echo "---Makefile---"; cat Makefile
Password: <hidden>
test
test
---Makefile---
all: first second
PASSWORD ?= $(shell read -s -p "Password: " pass; echo $$pass)
define formatted
first:
@echo $1
second:
@echo $1
endef
$(eval $(call formatted,$(PASSWORD)))