LINUX.ORG.RU
ФорумAdmin

Знак тильды ~ откуда берется

 , , ,


0

1

Столкнулся с проблемкой, скрипт /bin/sh не «видит» тильду - home dir. Сам скрипт /usr/bin/ssh-copy-id

Запускаю так: supervisord (user=admin) -> test.js

Сам код на node:

execSync("sshpass -p "pass" ssh-copy-id bla bla", {shell: "/bin/bash"})


Если запускать напрямую в консоле через bash этот скрипт test.js, то нормально. Если через supervosord, то `/usr/bin/ssh-copy-id` - пишет ошибку «mktemp: failed to create directory via template ‘~/.ssh/ssh-copy-id.XXXXXXXXXX’»

Залез в исходники /usr/bin/ssh-copy-id, дописал проверочную строчку:
ls -la ~
directory ls: cannot access '~':


Если я напрямую в script.js пишу и запускаю также через supervisord
execSync("mktemp -d ~/.ssh/ssh-copy-id.XXXXXXXXXX", {
    shell: "/bin/bash"
})

то тоже нормально, дира создается в папке /home/admin. Не пойму в чем затык?

Что за херня?

★★★★

~ резольвится в «$HOME» самим шеллом. Это не является частью непосредственно команды или линукса как такового. Поэтому когда ты запускаешь что-то не с помощью /bin/bash, то тильда будет воспринята как обычный символ, не специальный. shell: "/bin/bash" решает в данном случае.

CrX ★★★★★
()

Ну сделайте там вывод имени пользователя там же где ls делайте. whoami кажется команда. Тогда наверное попонятнее будет в чëм затык.

unDEFER ★★★★★
()
Ответ на: комментарий от CrX

Пробовал запускать через bash -c «script.sh», но все равно в script.sh ~ не видна. Как можно решить это? Этот гребаный supervisord не умеет в bash запускать...

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Не только. В zsh и dash тоже работает. Но не в каком-нибудь Python или JS.

На всякий случай добавлю, что всякие * и ? тоже резольвятся самим шеллом и вне шелла не будут работать так же.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от gobot

Я не знаю, но возможно этот пример вам поможет установить переменную HOME в supervisord

[program:apache2]
command=/home/chrism/bin/httpd -c "ErrorLog /dev/stdout" -DFOREGROUND
user=chrism
environment=HOME="/home/chrism",USER="chrism"
unDEFER ★★★★★
()
Ответ на: комментарий от gobot

HOME это домашняя директория юзера, в которого ты залогинился

А твой supervisord я не знаю что такое, но вероятно он никуда не логинится. И вообще, какого поведения ты ожидаешь от ssh-copy-id? Чьи данные он должен на сервер прописывать?

И вообще непонятно какую задачу ты решаешь.

firkax ★★★★★
()
Ответ на: комментарий от gobot

Нет, но она не обязана резольвиться в $HOME в скриптах.

Самый надёжный способ получать $HOME в sh-like скриптах следующий:

getent passwd $(id -u) | awk -F: '{print $6}'

Это будет работать и в Linux, и в BSD. По поводу совместимости с POSIX/IEEE не уверен, как и по поводу того, входит ли getent в стандарт UNIX, так что работоспособность под macOS под вопросом.

@Zhbert, будет под рукой macOS, проверь, пожалуйста.

mord0d ★★★★★
()
Ответ на: комментарий от anc

ЧТД, в принципе. Я особо не надеялся. (=
Благодарю.

Но в Linux, FreeBSD, OpenBSD и NetBSD эта конструкция точно работает. Причём как в POSIX Shell (sh, ash), так и в Bash, ZSH и Korn Shell (ksh).

Для tcsh нужно лишь заменить $() на бэктики (``). Про fish и прочую маргинальщину не знаю, но пользователи быстро разберутся как там делается сабшелл и пайпинг.

Без сабшелла можно извернуться вот так:

id -u | xargs getent passwd | awk -F: '{print $6}'

Без пайпов я не придумал и даже думать не желаю! (=

mord0d ★★★★★
()