Как сделать так, чтобы lsof перестал жаловаться при тестировании сокета?

Возможно, вы захотите сначала выполнить предварительную обработку.Мой лучший снимок сsed

echo "28/11/2018 06:20:57 PM" | sed -E "s/([0-9]+)\/([0-9]+)\/([0-9]+) ([0-9]+):([0-9]+):([0-9]+) ([APM]{2})/\3\/\2\/\1 \4:\5:\6 \7/g" | xargs -I II date -d II "+%y-%m-%d %H:%M:%S"

0
08.10.2020, 04:09
2 ответа

Если вы работаете в системе с последней версией ss(, такой как iproute2-ss190107в Debian 10 ), вы можете использовать ssвместоlsof:

sock=/path/to/socket
ino=$(stat -c 'ino:%i' "$sock") && ss -elx | grep -w "$ino"

sock=/path/to/socket
if ino=$(stat -c 'ino:%i' "$sock") && ss -elx | grep -qw "$ino"
then
   # yeah, somebody's listening on $sock
fi

Здесь следует отметить два важных момента:

  1. Реальный адрес сокета Unix — это числовой кортеж device,inode, , а не имя пути . Если файл сокета перемещен , какой бы сервер его ни прослушивал, он будет доступен по новому пути. Если файл сокета удален , другой сервер может прослушивать тот же путь (, поэтому права доступа к каталогу сокета Unix важны с точки зрения безопасности -). lsofне справляется с этим и может возвращать неполные/неверные данные.

  2. ssсам по себе содержит ошибки, и поскольку интерфейс unix_diagnetlink ssиспользует, возвращает номер устройства в формате, используемом внутри ядра Linux, но ssпредполагает, что он находится в формате, используемом интерфейсами системных вызовов, такими как stat(2), запись dev:в выводе ss -elxвыше будет управляться. Однако де -коверкать его может быть неразумно, потому что однажды они могут просто решить его починить. Таким образом, единственный способ действий — относиться к dev:как к чистому мусору и жить с риском иметь два файла сокетов с одним и тем же индексом, но в разных файловых системах, , с которыми приведенный выше тест не может справиться .


Если все вышеперечисленное не имеет значения для вас, вы можете сделать ту же паршивую вещь lsofделает (сопоставление на пути, к которому сокет был первоначально привязан ), с:

sock=/path/to/socket
ss -elx | grep " $sock "

, который также должен работать на более старых системах, таких как Centos 7. По крайней мере, это имеет то преимущество, что перечисляет только слушающие сокеты;-)

2
18.03.2021, 22:59

В итоге я сделал вот что:

if ! [[ -S $SSH_AUTH_SOCK && -n "`ss -xa 2>/dev/null | grep -F $SSH_AUTH_SOCK 2>/dev/null`" ]]; then
    # task to activate socket listener
fi

Некрасиво, но функционально.

0
18.03.2021, 22:59

Теги

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