Вы можете использовать функцию 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()
не дает возможности получить вывод команды, выполненной внутри. У вас есть доступ только к коду выхода, возвращаемому командой, запущенной внутри.
П.С. Ответ частично взят из полезных комментариев муру.
Не указаны параметры среды, так как эти два сценария не всегда эквивалентны:
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
.. Но я бы порекомендовал вам начать с решения первоначальной проблемы, прежде чем внедрять любой из этих дополнительных инструментов.