Многие инструменты могут быть статически скомпилированы (я точно знаю это с помощью netcat
) внутри Buildroot ( http://buildroot.uclibc.org/ ), а затем загружены с помощью wget
на устройство. Вот что я сделал в похожей ситуации.
Просто установите правильные параметры, вы можете получить к ним доступ с помощью make menuconfig
. Следующие страницы параметров, вероятно, будут для вас наиболее важными (я отметил часто важные параметры с помощью !>
):
│ ┌────────────────────────────────────────────────────────────────────────────┐ │ !>│ │ Target Architecture (FOOBAR) ---> │ │ │ │ Target Binary Format (ELF) ---> │ │ !>│ │ Target Architecture Variant (Gen42) ---> │ │ │ │ Target ABI (EABI) ---> │ │ │ │ Floating point strategy (Soft float) ---> │ │ │ │ │ │
!>│ │ libraries (static only) ---> │ │ │ │ ($(CONFIG_DIR)/local.mk) location of a package override file │ │ │ │ () global patch directories │ │ │ │ Advanced ---> │ │ │ └────────────────────────────────────────────────────────────────────────────┘
│ ┌────────────────────────────────────────────────────────────────────────────┐ │ │ │ Toolchain type (Buildroot toolchain) ---> │ │ │ │ (buildroot) custom toolchain vendor name │ │ │ │ *** Kernel Header Options *** │ │ !>│ │ Kernel Headers (Manually specified Linux version) ---> │ │ !>│ │ (2.6.99) linux version │ │ !>│ │ Custom kernel headers series (2.6.x) ---> │ │ │ │ C library (uClibc) ---> │ │ │ │ *** uClibc Options *** │ │ !>│ │ uClibc C library Version (uClibc 0.9.33.x) ---> │ │
Затем выполните сборку цепочку инструментов, используя make toolchain
, а затем какой инструмент вам нужен, например сделать nc
.
Как указал А.Б., ваша конфигурация ssh, вероятно, настроена для прослушивания определенного IP-адреса. Если этот IP-адрес недоступен при запуске sshd, служба не будет работать.
По умолчанию sshd настроен на перечисление 0.0.0.0
, что означает любой адрес, и, таким образом, не зависит от наличия конкретного IP-адреса.
Есть два способа решить эту проблему:
network-online.target
systemd предоставляет модуль network-online.target
для сервисов, которым требуется полная работа сети (для всех настроенных интерфейсов ). Таким образом, вы можете запустить sshd после того, как этот модуль запустится после настройки интерфейса
mkdir /etc/systemd/system/sshd.service.d
cat > /etc/systemd/system/sshd.service.d/network-online.conf <<EOF
[Unit]
After=network-online.target
EOF
systemctl daemon-reload
Другой вариант — разрешить прослушивание адресов, отсутствующих на хосте.
Это решение является общесистемным, поэтому оно применимо к любой службе, а не только к sshd.
echo 'net.ipv4.ip_nonlocal_bind = 1' > /etc/sysctl.d/99-nonlocal_bind.conf
systemctl restart systemd-sysctl.service
У меня была такая же проблема, и я несколько раз натыкался на этот вопрос при поиске в сети.
Обходной путь заключается в привязке sshd
к двум адресам. Адрес нужного интерфейса, например192.168.0.23
и адрес петли 127.0.0.1
.
ListenAddress 127.0.0.1
ListenAddress 192.168.0.23
Однако это не мешает ssh вызывать ошибку. Но вместо сбоя ssh через секунду перезагружается и потом привязывается к правильному адресу. Вот пример разницы.
192.168.0.23
sshd[378]: error: Bind to port 22 on 192.168.0.23 failed: Cannot assign requested address.
sshd[378]: fatal: Cannot bind any address.
systemd[1]: ssh.service: Main process exited, code=exited, status=255/n/a
systemd[1]: ssh.service: Unit entered failed state.
192.168.0.23
и127.0.0.1
sshd[390]: error: Bind to port 22 on 192.168.0.23 failed: Cannot assign requested address.
sshd[390]: Server listening on 127.0.0.1 port 22.
sshd[390]: Received SIGHUP; restarting.
sshd[390]: Server listening on 192.168.0.23 port 22.
sshd[390]: Server listening on 127.0.0.1 port 22.
Основываясь на ответе @phemmer, у меня возникла та же проблема, и я исправил ее, добавив
[Unit]
Wants=network-online.target
After=network-online.target
в файле конфигурации /etc/systemd/system/sshd.service.d
.
Также убедитесь, что для вашего сетевого менеджера включена правильная служба ожидания, как описано здесь . Например:
$ systemctl is-enabled NetworkManager-wait-online.service systemd-networkd-wait-online.service