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

Это немного сложно из-за того, что Linux является «слабой системой». Избегайте этого, если можете.

Посмотрите этот вопрос о Serverfault .

Если проблемы ARP решены (трафик из SAN в eth1 ), все, что вам нужно, это запись маршрутизации для SAN:

# with then SAN address being 1.2.3.4 and the eth1 address 1.2.3.5
ip route add 1.2.3.4/32 dev eth1 src 1.2.3.5

0
12.06.2019, 17:40
2 ответа

Команда чтения не игнорируется; он выполняет его и читает стандартный ввод. Затем строка echo "the name is $nameсчитывается (из стандартного ввода )и присваивается $name.

su myUser<<SESSION
set -x 
echo -n \"Enter your name and press [ENTER]: \"
read name
someUser
echo \"the name is \$name\"
SESSION

выход:

+ echo -n '"Enter' your name and press '[ENTER]:' '"'
-n "Enter your name and press [ENTER]: "
+ read name
+ echo '"the' name is 'someUser"' 
"the name is someUser"
1
28.01.2020, 02:22

Как правильно обнаружил Л. Скотт Джонсон , readсчитывается со стандартного ввода. Стандартный ввод в оболочке, которая выполняется su, связан с документом здесь -, поэтому readсчитывает литеральную строку echo "the name is "(, обратите внимание, что, поскольку документ здесь -не заключен в кавычки, $nameимеет уже был расширен до пустой строки или любого другого значения, которое оно имело в вызывающей оболочке ).

Вот то же самое, но с цитируемым здесь документом -и лишней строкой, выводящей снова $name:

su username <<'SESSION'
set -x
echo -n "Enter your name and press [ENTER]: "
read name
echo "the name is $name"
echo "What I read was $name"
SESSION

Вывод будет

Password:
+ echo -n Enter your name and press [ENTER]:
Enter your name and press [ENTER]: + read name
+ echo What I read was echo "the name is $name"
What I read was echo "the name is $name"

Чтобы правильно это сделать, вы не можете readчитать со стандартного ввода. Вместо этого откройте новый файловый дескриптор как копию стандартного ввода и заставьте readчитать из него:

su username 3<&0 <<'SESSION'
set -x
echo -n "Enter your name and press [ENTER]: "
read name <&3
echo "the name is $name"
SESSION

Если оболочка другого пользователя bashили ksh, то read name <&3можно заменить на read -u3 name.

Обратите внимание, однако, что вы не можете ожидать, что переменная nameбудет установлена ​​в оболочке, вызывающей su, поскольку дочерняя оболочка не может изменять переменные среды (и т. д. )родительской оболочки.

3
28.01.2020, 02:22

Теги

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