Использование `printf `для вывода символов с заданными номерами ASCII

У меня была такая же проблема. [ftp://192.168.122.1/repodata/repomd.xml:[Errno 14] Ошибка FTP 550 -Сервер отказал вам в переходе в указанный каталог]

Первоначально думал, что это связано с разрешением или какой-то проблемой безопасности, но это не так.

Когда я попытался загрузить файл repomd.xml с клиентского компьютера с помощью wget [wgetftp://192.168.122.1/repodata/repomd.xml] , он сказал, что файл не найден.

В моем случае проблема заключалась в том, что в файле конфигурации /etc/vsftp.conf мой каталог реподанных должен был быть /var/ftp(anon _root=/var/ftp/pub ), но я хранил под /var/ftp/. Ожидается, что «repodata/repomd.xml» будет помещен в «/var/ftp» в соответствии с настройками в vsftp.conf

.

Затем я просто переместил свои подкаталоги внутрь /var/ftp::

root@uday-linux:/var/ftp# pwd
/var/ftp
root@uday-linux:/var/ftp# ls
openstack-queens-rdo-repo
root@uday-linux:/var/ftp# ls openstack-queens-rdo-repo/
openstack-queens  rdo-qemu-ev  repodata  rhel-7-server-extras-rpms  rhel-7-server-optional-rpms  rhel-7-server-rh-common-rpms  rhel-7-server-rpms
root@uday-linux:/var/ftp# ls
openstack-queens-rdo-repo
root@uday-linux:/var/ftp# mv openstack-queens-rdo-repo/*.
root@uday-linux:/var/ftp# rmdir openstack-queens-rdo-repo
root@uday-linux:/var/ftp# ls
openstack-queens  rdo-qemu-ev  repodata  rhel-7-server-extras-rpms  rhel-7-server-optional-rpms  rhel-7-server-rh-common-rpms  rhel-7-server-rpms
root@uday-linux:/var/ftp# 
root@uday-linux:/var/ftp# 

8
21.03.2021, 11:05
3 ответа

О, конечно, просто это нужно сделать в два этапа. Как двухшаговое танго:

$ printf "$(printf  '\\x%s' 48 65 6c 6c 6f)"; echo
Hello

Или, альтернативно:

$ test () { printf "$(printf  '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello

Или, чтобы не печатать «без аргументов»:

$ test () { [ "$#" -gt 0 ] && printf "$(printf  '\\x%s' "$@")"; echo; }
$ test 48 65 6c 6c 6f
Hello
$ 

Это предполагает, что аргументы являются десятичными значениями от 1 до 127. (пустые аргументы будут подсчитаны, но при печати произойдет сбой ).

5
28.04.2021, 22:58
За

\xдолжно следовать буквальное шестнадцатеричное значение:

$ printf '\x48\n'
H
$ c=48
$ printf '\x%s\n' "$c"
bash: printf: missing hex digit for \x
\x48

Предположительно, это связано с тем, что printfбудет расширять любые шестнадцатеричные литералы в строке формата в качестве отдельного шага перед использованием результирующей строки в качестве формата.

Что вы можете сделать вместо этого:

unhexlify() {
    for character
    do
        format="\x${character}"
        printf "$format"
    done
    printf '\n'
}

Тест:

$ unhexlify 48 65 6c 6c 6f
Hello
2
28.04.2021, 22:58

Используя perl и его функцию pack, мы упаковываем две шестнадцатеричные цифры и печатаем представление ASCII.

charx() {
  perl -le 'print pack "(H2)*", @ARGV' -- "$@"
}

Мы используем настольный калькулятор dc для ввода базы 16 и распечатки их символов ASCII с помощью команды a .

charx() {
dc <<eof
16i
$(echo "$@" | tr a-f A-F)
[SAz0<a]sa
[LAanln1-dsn0<b]sb
[zsnlaxlbxAan]sc
z0<c
eof
}

Используется как:

charx  48 65 6c 6c 6f

Результат

 Hello
2
28.04.2021, 22:58

Теги

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