2013-12-19 1 views
9

Я пишу Makefile, и некоторые из команд, которые запускают makefile, требуют пароля. Я хотел бы предоставить пользователю возможность передать это как переменную Makefile, используя make PASSWORD=password, или если пользователь не передает его, затем предложите пользователю его и сохраните свой ответ в указанной переменной Makefile.Как мне заставить `make` запрашивать у пользователя пароль и хранить его в переменной Makefile?

На данный момент я могу проверить переменную Makefile, а затем как часть моих целевых конкретных правил написать команды оболочки, которые запрашивают пароль пользователя и сохраняют его в переменной оболочки. Однако эта переменная доступна только для этой конкретной оболочки, а не для других.

Как я могу что-то прочитать у пользователя и сохранить его в переменной?

Я попытался следующие:

PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $pwd) 

но подсказка никогда не печатается. Я также пробовал echo "Password: " внутри оболочки, но это тоже не печатается.

Любые идеи?

Edit:

Для уточнения, пароль должен быть установлен для определенной цели, так что у меня есть что-то вроде этого:

PASSWORD := 

my-target: PASSWORD ?= $(shell read -s -p "Password: " pwd; echo $$pwd) 

my-target: 
    # rules for mytarget that use $(PASSWORD) 

Edit 2:

I нашел проблему. Когда я устанавливаю PASSWORD := в начале скрипта, он устанавливает PASSWORD в пустую строку, и это, в свою очередь, вызывает пропущение ?= (начиная с PASSWORD).

+0

Какая команда нужна пароль? SSH?Вместо этого вы можете использовать ssh-passwordless login? http://askubuntu.com/questions/46930/how-can-i-set-up-password-less-ssh-login –

+0

нет, не ssh. Мне нужно запустить завиток 3 раза против службы, требующей аутентификации. curl может запросить собственный пароль, но я бы не принуждал пользователя вводить его 3 раза. – bluesmoon

+0

Я чувствую, что пароли открытого текста в переменных переменных могут быть уязвимы для эксплуатации. Я не уверен, как его использовать, но злоумышленнику может быть легко сбросить переменные makefile (make -pn) и получить этот пароль. Just sayin ';-) –

ответ

16

Пара вещей:

  • $ для разыменования переменной оболочки pwd интерпретируется по make. Вы можете избежать этого из make с помощью $$
  • make вызывает оболочку как совместимую с Posix /bin/sh вместо /bin/bash. Таким образом, опция -s для read не поддерживается.

Попробуйте вместо этого:

PASSWORD ?= $(shell bash -c 'read -s -p "Password: " pwd; echo $$pwd') 

Это работает для меня на Ubuntu 12,04/GNU сделать 3.81/Баш 4.2.25 (1)

А на OSX 10.8.5/сделать 3.81/Баш 3.2.48 (1):

 
$ 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 
$ 

Update - @ user5321531 указал, что мы может нам POSIX ш вместо Баш, и временно подавить эхо с stty:

PASSWORD ?= $(shell stty -echo; read -p "Password: " pwd; stty echo; echo $$pwd) 
+1

, похоже, не работает на MacOSX/GNU Make 3.81/bash 3.2.48. Он отказывается распечатать приглашение. – bluesmoon

+0

@bluesmoon - похоже, он работает на OSX как Ubuntu для меня. Может, я что-то упустил? Я добавил свой тестовый Makefile и консольный журнал для ответа. –

+0

А, я вижу разницу. Мне нужна переменная, предназначенная только для конкретной цели. Я отредактирую вопрос с примера. – bluesmoon

Смежные вопросы