Сценарий оболочки обычно выполняется в отдельном экземпляре программной оболочки, /bin/sh
в этом случае. Ваш pushd
управляйте влияет на рабочий каталог той подоболочки только. Если бы это было иначе, то любая программа, которую Вы запустили от оболочки, могла бы смешать с рабочим каталогом Вашей оболочки.
Для выполнения того сценария в текущей оболочке скажите это вместо этого:
$ . my-command somedir
или, больше verbosely:
$ source my-command somedir
Чтобы заставить ее появиться, что Ваша программа работает как любой другой, можно использовать псевдоним:
$ alias mycmd='source my-command'
$ mycmd /bin
$ pwd
/bin
Вам нужно что-то, что это способно к отправке пакета Ethernet, который будет замечен устройством, которое Вы хотите разбудить.
ether-wake
команда в BusyBox точно, что Вы после. Если Ваш BusyBox не имеет его, считайте перекомпиляцию BusyBox для включения его.
Если Вы имеете достаточно “bloaty” netcat (BusyBox может иметь один из два nc
реализации, одна из которых обрабатывает только TCP), можно отправить вручную обработанный пакет UDP в широковещательный адрес сегмента сети, с которым подключено устройство.
mac=$(printf '\xed\xcb\xa9\x87\x65\x43') # MAC = ed:cb:a9:87:65:43
wol_packet=$(printf "\xff\xff\xff\xff\xff\xff$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac$mac")
echo "$wol_packet" | nc -u 7 192.0.2.255
Другая утилита BusyBox, которую Вы могли злоупотребить в отправку того пакета, syslogd
.
syslogd -n -O /dev/null -l 0 -R 192.0.2.255/7 &
syslogd_pid=$!
logger "$wol_packet"
kill $!
Если MAC будет содержать пустой байт, то Вы не сможете обработать пакет так легко. Выберите байт, который это не \xff
и это не находится в MAC, сказать \x42
(B
), и канал через tr
.
echo "$wol_packet" | tr B '\000' | nc -u 7 192.0.2.255
Если у Вас действительно есть удар (который чрезвычайно необычен на устройствах с BusyBox — действительно ли Вы уверены, что у Вас действительно есть удар и не другая оболочка, обеспеченная BusyBox?), это может отправить пакеты UDP путем перенаправления к /dev/udp/$hostname/$port
.
echo "$wol_packet" >/dev/udp/192.0.2.255/7
/dev/udp
распознан ударом и действительно не существует в файловой системе, поэтому дает ему попытку.
Я думаю, что можно использовать syslogd
без -l
переключатель, пока это поддерживает -R
.
У меня есть busybox с syslogd
withount -R
, нет nc
ни bash
и я все еще застреваю.
У меня есть ssh сервер, работающий на старой мечте HTC. Моя версия busybox также не включала след эфира, и я не достаточно квалифицирован для компиляции моего собственного busybox. К счастью, мне удалось разбудить мое использование ПК:
bash
cat mac2.txt | tr B '\000' >/dev/udp/192.0.1.255/7
Заметьте, что широковещательный IP отличается в моей сети.
Я обработал файл (mac2.txt), содержащий волшебный пакет на моем ПК, и продвинул его к серверу через SFTP. Поскольку мой Mac имеет пустой байт, я должен использовать TR для замены всеми x42 байтами с 00. Это работало как очарование.