Почему «ssh -t» не работает при входе в систему и выполнении команды?

Вы можете использовать функцию split(), чтобы разделить комбинацию IP/порт и получить IP для последующего использования в команде dig().

END { 
  for(i in a) {
    split(i, ip)
    cmd=sprintf("dig +short -x \"%s\"", ip[1])
    (cmd | getline type) > 0 ? "" : type="notResolved"
    printf("%s %s %s\n",i,a[i],type);
    close(cmd)
  }
}

Я добавил способ проверки состояния команды digи использовал тернарный оператор ?для обновления значения типа. В случае сбоя вы можете добавить свою собственную строку (, например 'notResolved'в приведенном выше ), и распечатать результат.

Обратите внимание, что использование вызова getline()в awkотличается от использования вызова system(). Тип cmd | getline varиспользует каналы, как если бы cmdзапускается из оболочки, каждый вызов getline varсчитывает одну строку вывода из команды. Однако команда system()не дает возможности получить вывод команды, выполненной внутри. У вас есть доступ только к коду выхода, возвращаемому командой, запущенной внутри.

П.С. Ответ частично взят из полезных комментариев муру.

1
15.09.2021, 16:44
1 ответ

Не указаны параметры среды, так как эти два сценария не всегда эквивалентны:

ssh remoteHost
someCommand

ssh -t remoteHost someCommand

Этот следующий командный блок даст вам набор переменных, отсутствующих в предпочитаемом вами решении (второго формата в двух примерах выше ). Вы можете либо добавить их к своему вопросу, и я дополню этот, чтобы объяснить, как их установить, либо вы можете использовать информацию самостоятельно, чтобы установить их.

ssh -t myvirtual.local env | grep = | sort >/tmp/env.1
( echo env; echo exit ) | ssh -tt myvirtual.local | grep = | sort >/tmp/env.2
comm -13 /tmp/env.1 /tmp/env.2

Сокращенный пример вывода системы, который у меня есть здесь

EDITOR=vi
HISTCONTROL=ignoredups
LESSCLOSE=/usr/bin/lesspipe %s %s
LESSOPEN=| /usr/bin/lesspipe %s
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:...
PAGER=less
PATH=/home/roaima/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin:/bin
PROMPT_COMMAND_WAS=echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"
SHLVL=1
SSH_CLIENT=192.1.1.9 31996 22
SSH_CONNECTION=192.1.1.9 31996 192.1.1.18 22
TTY=/dev/pts/0
XDG_SESSION_ID=c61

Это не имеет ничего общего с Ruby или Rails, но показывает, что в моем случае переменная PATHотличается (вы сможете увидеть фактические значения в /tmp/env.1и/tmp/env.2).

После того, как вы отследите и отсортируете это, вы можете запустить foremanпод screenили tmux, чтобы он не получал сигнал SIGHUPпри разрыве соединения ssh.. Но я бы порекомендовал вам начать с решения первоначальной проблемы, прежде чем внедрять любой из этих дополнительных инструментов.

0
20.09.2021, 13:59

Теги

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