sudo
команда может выполнить что-либо как конкретного пользователя с -u
опция. Вместо того, чтобы волноваться об оболочках, просто попытайтесь cat
(или выполнитесь, безотносительно), Ваш файл как Ваш целевой пользователь:
$ sudo -u apache cat .ssh/authorized_keys
cat: .ssh/authorized_keys: Permission denied
Я использовал-r, и-p переключаются на xxd:
$ echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Благодаря вдохновению из ответа @Gilles вот версия жемчуга:
$ echo '0006303030304e43' | perl -e 'print pack "H*", <STDIN>' | nc -l localhost 8181
Здесь решение без xxd
или perl
:
Если echo
встроенный из Вашей оболочки поддерживает его (bash
и zsh
сделайте, но нет dash
), просто необходимо использовать правильные Escape обратной косой черты:
echo -ne '\x00\x06\x30\x30\x30\x30\x4e\x43' | nc -l localhost 8181
Если Вы имеете /bin/echo
от GNU coreutils (почти стандарт в системах Linux) или от busybox можно использовать его, также.
С sed
можно генерировать завершенный шаблон:
$ echo '0006303030304e43' | sed -e 's/../\\x&/g'
\x00\x06\x30\x30\x30\x30\x4e\x43
Объединенный:
echo -ne "$(echo '0006303030304e43' | sed -e 's/../\\x&/g')" | nc -l localhost 8181
Если Вы имеете xxd
, это легко: это может преобразовать в и от шестнадцатеричного.
echo '0006303030304e43' | xxd -r -p | nc -l localhost 8181
Я не думаю, что существует разумное (и довольно быстро) способ преобразовать шестнадцатеричный в двоичный файл с помощью только инструменты POSIX. Это может быть сделано довольно легкое в Perl. Следующий сценарий преобразовывает шестнадцатеричный в двоичный файл, игнорируя любой вводимый символ, который не является шестнадцатеричной цифрой. Это жалуется, содержит ли входная строка нечетное число шестнадцатеричных цифр.
#!/usr/bin/env perl
$^W = 1;
$c = undef;
while (<>) {
tr/0-9A-Fa-f//cd;
if (defined $c) { warn "Consuming $c"; $_ = $c . $_; $c = undef; }
if (length($_) & 1) { s/(.)$//; $c = $1; }
print pack "H*", $_;
}
if (!eof) { die "$!"; }
if (defined $c) { warn "Odd number of hexadecimal digits"; }
Если действительно необходимо придерживаться POSIX (например, на встроенном устройстве), я рекомендую использовать Base64 вместо шестнадцатеричного. Можно использовать программу uudecode для декодирования Base64. Вход должен иметь формат заголовка и линию конца, продолженную Uuencode, это не может быть необработанный Base64.
uudecode <<EOF | nc -l localhost 8181
begin-base64 644 -
AAYwMDAwTkM=
====
EOF