Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何让'make'提示用户输入密码并将其存储在Makefile变量中?_Bash_Makefile - Fatal编程技术网

Bash 如何让'make'提示用户输入密码并将其存储在Makefile变量中?

Bash 如何让'make'提示用户输入密码并将其存储在Makefile变量中?,bash,makefile,Bash,Makefile,我正在编写一个Makefile,Makefile运行的一些命令需要密码。我想让用户能够使用makepassword=PASSWORD将其作为Makefile变量传入,或者如果用户没有传入,则提示用户输入,并将其响应存储在所述Makefile变量中 目前,我能够检查Makefile变量,然后作为特定于目标的规则的一部分,编写shell命令,提示用户输入密码并将其存储在shell变量中。但是,此变量仅适用于该特定shell,而不适用于任何其他shell 如何从用户处读取内容并将其存储在变量中 我尝试

我正在编写一个Makefile,Makefile运行的一些命令需要密码。我想让用户能够使用
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
    进行解释。您可以使用
    $$
  • make
    正在调用shell作为与Posix兼容的
    /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)))