Нет разбиения слов (, как в функции, которая разбивает переменные при раскрытии без кавычек )в этом коде, поскольку $myvar
не заключен в кавычки.
Однако существует уязвимость, связанная с внедрением команд, поскольку $myvar
расширяется перед передачей в bash
. Таким образом, его содержимое интерпретируется как код bash!
Пробелы в нем вызовут передачу нескольких аргументов в cd
не из-за разбиения слов , а потому, что они будут проанализированы как несколько токенов в синтаксисе оболочки. При значении bye;reboot
произойдет перезагрузка!¹
Вот вам бы:
sudo bash -c 'cd -P -- "$1"' bash "$myvar"
(где вы передаете содержимое $myvar
в качестве первого аргумента этого встроенного скрипта; обратите внимание, как $myvar
и $1
были заключены в кавычки для соответствующей оболочки, чтобы предотвратить разбиение IFS -слова -(и подстановку )).
Или:
sudo MYVAR="$myvar" bash -c 'cd -P -- "$MYVAR"'
(где вы передаете содержимое $myvar
в переменную окружения ).
Конечно, вы не добьетесь ничего полезного, запустив толькоcd
во встроенном скрипте (, кроме как проверив, может ли root
cd
туда ). Предположительно, вы хотите, чтобы этот скрипт cd
тут же делал что-то еще, например:
sudo bash -c 'cd -P -- "$1" && do-something' bash "$myvar"
Если намерение состояло в том, чтобы использовать sudo
, чтобы иметь возможность cd
в каталог, к которому у вас иначе нет доступа, то это не может работать.
sudo sh -c 'cd -P -- "$1" && exec bash' sh "$myvar"
запустит интерактивный bash
с текущим каталогом в $myvar
. Но эта оболочка будет работать как root
.
Вы могли бы сделать:
sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
Чтобы получить непривилегированный интерактив bash
с текущим каталогом $myvar
,но если у вас изначально не было прав доступа cd
к этому каталогу, вы не сможете ничего делать в этом каталоге, даже если это ваш текущий рабочий каталог.
$ myvar=/var/spool/cron/crontabs
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ ls
ls: cannot open directory '.': Permission denied
Исключением будет, если у вас есть разрешение на поиск в самом каталоге, но не в одном из компонентов каталога его пути:
$ myvar=1/2
$ mkdir -p "$myvar"
$ chmod 0 1
$ cd 1/2
cd: permission denied: 1/2
$ sudo sh -c 'cd -P -- "$1" && exec sudo -u "$SUDO_USER" bash' sh "$myvar"
bash-4.4$ pwd
/home/stephane/1/2
bash-4.4$ mkdir 3
bash-4.4$ ls
3
bash-4.4$ cd "$PWD"
bash: cd: /home/stephane/1/2: Permission denied
¹ Строго говоря, для значений $myvar
, таких как$(seq 10)
(буквально ), при расширении этой подстановки команд оболочкой bash
, запускаемой как root
Обратите внимание: поскольку вы не упомянули, с какой ОС вы работаете, я предполагаю, что это GNU/Linux (, что может быть неверным предположением, поскольку это «UNIX и Linux» ).
Под Linux настройка стека TCP во время выполнения обычно достигается с помощью sysctl
и/или procfs.
Итак, вам, вероятно, следует начать с просмотра:
Documentation/sysctl/
в исходном коде вашего ядра. (Вы также можете использовать этот сайт). Чтобы узнать, есть ли какие-либо опции/параметры, которые позволяют это сделать.
Беглый взгляд на исходный код ядра(net/ipv4/tcp.c
)показывает, что использование флага FIN для завершения работы "запрограммировано" и не может быть изменено... извините.
Может быть, вы можете попытаться написать патч, чтобы изменить это поведение... но я бы не стал устанавливать такой патч на рабочем сервере;-)
Похоже, сделать то, что вы просили, невозможно.
Тем не менее, возможно, вы сможете смягчить проблему «слишком много ВРЕМЕНИ _WAIT», настроив некоторые другие параметры, такие как net.ipv4.tcp _fin _timeout (, также доступные в/proc/sys/net/ipv4/tcp_fin_timeout
).
Обратите внимание: если у вас есть доступ к исходному коду приложения, вы также можете настроить его поведение, используя setsockopt()
для созданного сокета.
Не IP _ПРОЗРАЧНЫЙ, но здесь может быть другое решение вашей проблемы.
(Публикация как ответ, а не как комментарий, чтобы блок кода был читабельным)
Если ваш Linux-компьютер является клиентом, а не сервером, вы можете поэкспериментировать со следующим в /etc/sysctl.conf по одному или вместе, а затем sysctl -p
. Пожалуйста, посмотрите, что каждый из них делает, чтобы увидеть, подходит ли каждый из них для вашего использования.
net.ipv4.ip_local_port_range = 2000 65535
net.ipv4.tcp_tw_reuse = 1
Отличная статья, объясняющая кровавые подробности:https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux