оценка использовала с переданной по каналу командой

К сожалению, я должен ответить на вопрос сам теперь. "К сожалению", потому что ответ "нет, Это не возможно".

Я смотрел на то, как КАША работает и пришла к выводу, что логически невозможно сохранить пароль как значение хэш-функции.

С КАШЕЙ имя пользователя и пароль отправляются непосредственно стороне аутентификации. Поэтому пароль должен быть известен, зная, что некоторый хеш не достаточен.

Благодарен за то, что @tink ищет, тем не менее.

Но я все еще ничего не мог найти об этой внешней вещи устройства хранения данных. Решение для меня в этом особом случае использует незашифрованный Wi-Fi (который также обеспечивается моим университетом), и VPN.

4
21.06.2014, 17:44
4 ответа

eval не считывает свою командную строку из stdin.

eval "$(cat file.txt)"
# or easier, in ksh/bash/zsh
eval "$(<file.txt)"
# usually you cannot be sure that a command ends at the end of line 5
eval "$(head -n 5 file.txt)"

Вместо eval можно использовать стандарт . или bash/zsh/ksh ksh, если команды все равно находятся в файле:

source ./file

(обратите внимание, что важно добавить это /. В противном случае источник ищет файл в $PATH , прежде чем рассматривать файл в текущем каталоге. Если в режиме POSIX bash даже не рассматривает файл в текущей директории, даже если он не найден в $PATH).

Это, конечно же, не работает с выбором части файла. Это можно сделать с помощью:

head -n 5 file.txt >commands.tmp
source ./commands.tmp

Или (с помощью ksh93, zsh, bash):

source <(head -n 5 file.txt)
13
27.01.2020, 20:46

так что... решение вашего вопроса возможно на 100%, и (в контекстеmake)важно.

Я столкнулся с этим в make-файле, и учитывая сложность вложения команд bash в make-файл, который уже использует $(...)для вызова переменных, приятно иметь возможность делать именно то, о чем вы спрашиваете.

Вместо использования evalпросто используйте awkили perlсистемную команду:

// command_list.sh:
echo "1"
echo "2"
echo "3"

// command line prompt:
$: cat command_list.sh | awk '{system($0)}'
1
2 
3

А, командный пункт:

// a readable version--rather than building up an awk miniprogram, 
// split into logical blocks:

$: cat inputs.txt | awk '{print "building "$1" command "$2" here "}' | awk '{system($0)}' 
3
27.01.2020, 20:46

Технически невозможно оценить что-то в вашей текущей среде, если вы хотите прочитать это из конвейера, поскольку каждая команда в конвейере выполняется как отдельный процесс.

Однако, в зависимости от того, чего вы пытаетесь достичь, это может не иметь значения. В любом случае здесь работает evalс содержимым канала:

❯ echo echo hi | eval "$(cat -)"
hi

Вот пример подвоха. Что-то вроде следующего не будет напечатано1:

❯ echo a=1 | eval "$(cat -)"; echo $a

Вместо этого нам пришлось бы сделать следующее:

❯ echo a=1 | { eval "$(cat -)"; echo $a; }
1
0
18.03.2021, 19:48

Если вы не собираетесь использовать eval, используйтеsh:

cat file.txt | sh

Да, он будет работать в отдельном экземпляре sh, но этот факт -задокументирован.

И ещеwhile read:

cat file.txt | while read cmd; do eval $cmd; done

Выполнить команду на 5-й строке файла.txt:

sed -n 5p file.txt | sh

(Я понимаю, что это старый вопрос.)

0
08.04.2021, 00:04

Теги

Похожие вопросы