Вы могли сделать что-то вдоль этих строк:
file=/some/file
newtext='sol { mass = 42, start = 9.2 }'
tac -- "$file" |
NEWTEXT=$newtext awk -v size="$(wc -c < "$file")" '
$1 ~ /^[^#]/ {
system("dd bs=1 seek=" size - length(footer) " conv=notrunc if=/dev/null")
printf "%s\n%s", ENVIRON["NEWTEXT"], footer
exit
}
{footer=$0 "\n" footer}' 1<> "$file"
Это перезаписывает файл на месте и только хранит нижний колонтитул в памяти. Этому нужен нестандартный GNU tac
команда. Файл должен быть файлом обычного текста.
В bash Ctl + alt + e
выполняет расширение оболочки, таким образом вводя ! 1255
, а затем нажимая эту комбинацию, заменяет текущую строку содержимым записи истории 1255
Нажатие клавиши Ctrl + R (которая представляет собой привязку ключа обратного инкрементного поиска emacs как @ gnp, переданную в комментариях) в терминале позволяет выполнять поиск конкретной команды в области. Команда будет показана и может быть отредактирована перед выполнением. Вы увидите что-то подобное:
-121--29565-Пока мне повезло получить соединения контейнера, запустив netstat из контейнера:
sudo docker exec -it <containerIdOrName> netstat
Очевидно, контейнер должен быть установлен.
Я думаю, вы можете использоватьsudo conntrack -L
conntrack is a userspace command line program targeted at system administrators. It enables them to view and manage the in-kernel connection tracking state table.
Если пакет не установлен, требуетсяconntrack-tools
(в Fedora и т. д. )илиconntrack
(в Debian, Ubuntu и т. д. ).
Аналогичным обходным решением является выполнение команды netstat/lsof для всего сетевого пространства имен с
sudo ip -all netns exec ss -p -ut
или
sudo ip -all netns exec lsof -i
или
sudo ip -all netns exec netstat -ltup
Ядро указывает состояние соединений на /proc/net/tcp
, /proc/net/udp
и т. д., но поскольку пространства имен разделяют сетевой стек, если приложение выполняется внутри контейнера (другое пользовательское пространство )и подключено к сети хост /proc/net/tcp
не показывает свое соединение,
conntrack
можно использовать для отображения всего соединения машины , но это не работает для некоторых интерфейсов, таких как wireguard...
ip -all netns exec command
можно использовать для запуска команд во всех пользовательских пространствах , но это ограничено пользовательскими пространствами, созданными с помощью команды ip
.
С точки зрения приложения, работающего в контейнере, его состояние сетевого стека по-прежнему видно на хосте в расположении /proc/$pid/net/tcp
, поэтому в качестве обходного пути, ожидающего написания надлежащего инструмента на языке c, я написал небольшой сценарий bash, который зацикливается. на /proc/$pid/net/tcp[udp]
и объедините все состояния, чтобы иметь возможность перечислить все подключения к машине.
Скрипт сначала объединяет все /proc/$pid/net/tcp
или /proc/$pid/net/udp
сортирует их, удаляет дубликаты, переводит значение в читаемый текст и печатает их (скрипт требует find
, grep
, xargs
, awk
, strtonum
, sort
иuniq
)
Для TCP
find /proc/ 2>/dev/null | grep tcp | grep -v task | grep -v sys/net | xargs grep -v rem_address 2>/dev/null | awk '{x=strtonum("0x"substr($3,index($3,":")-2,2)); y=strtonum("0x"substr($4,index($4,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($3,i,2)); for (i=5; i>0; i-=2) y = y"."strtonum("0x"substr($4,i,2))}{printf ("%s\t:%s\t ----> \t %s\t:%s\t%s\n",x,strtonum("0x"substr($3,index($3,":")+1,4)),y,strtonum("0x"substr($4,index($4,":")+1,4)),$1)}' | sort | uniq --check-chars=25
Для UDP
find /proc/ 2>/dev/null | grep udp | grep -v task | grep -v sys/net | xargs grep -v rem_address 2>/dev/null | awk '{x=strtonum("0x"substr($3,index($3,":")-2,2)); y=strtonum("0x"substr($4,index($4,":")-2,2)); for (i=5; i>0; i-=2) x = x"."strtonum("0x"substr($3,i,2)); for (i=5; i>0; i-=2) y = y"."strtonum("0x"substr($4,i,2))}{printf ("%s\t:%s\t ----> \t %s\t:%s\t%s\n",x,strtonum("0x"substr($3,index($3,":")+1,4)),y,strtonum("0x"substr($4,index($4,":")+1,4)),$1)}' | sort | uniq --check-chars=25
Вывод выглядит следующим образом:(обратите внимание, что pid не является точным и используется только для идентификации контейнера)
127.0.0.1 :80 ----> 0.0.0.0 :0 /proc/10176/net/tcp:
192.168.0.2 :33882 ----> 192.30.253.125 :443 /proc/10176/net/tcp
192.168.0.2 :34020 ----> 192.30.253.125 :443 /proc/10176/net/tcp:
192.168.0.2 :34162 ----> 192.30.253.125 :443 /proc/10176/net/tcp:
192.168.0.2 :36242 ----> 192.30.253.124 :443 /proc/10176/net/tcp:
192.168.0.2 :37324 ----> 192.30.253.124 :443 /proc/10176/net/tcp:
192.168.0.2 :40122 ----> 216.239.38.21 :80 /proc/10176/net/tcp:
192.168.0.2 :40124 ----> 216.239.38.21 :80 /proc/10176/net/tcp:
Также я нашел отличный инструмент для управления пространством имен с некоторыми очень полезными командами, nsutils