Вы правы в этом echo
И компания, кажется, не обрабатывает двоичный файл настолько хорошо. Я подозреваю, что нулевые символы повреждают поток слишком рано.
Можно преобразовать информацию об изображении в некотором основанном на ASCII формате. Например, это с base64
:
$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0
Я тестировал это в контексте виртуальной машины: SSH-сервер - это Cygwin (также VM-хост); клиент - это Arch Linux SSH (также VM-гость).
Я использовал следующий скрипт.
Я не хочу закрываться, поэтому мне не нужно копировать никакие двоичные файлы в папку общего доступа, а только скопировать открытый ключ. В любом случае, я думаю, что, используя внутренний sftp (не SSH), требования к двоичным файлам должны быть снижены.
#!/bin/sh
## Setup SFTP access on server side
## using an alias user and to a subdir of the aliased user home
## ------------------------------------------------------------
## Customise
## Shared path inside the aliased user home
sharedpath="/home/jon/pub"
## Aliased user name
altuser="pub"
## Path to the public key of aliased user
pubkey=~/.ssh/pub_rsa.pub
## Add aliased user to /etc/passwd
user=`grep ^$USER /etc/passwd`
txt="$altuser:`echo $user | cut -d: -f2-5`"
txt="$txt:$sharedpath:`echo $user | cut -d: -f7`"
echo $txt>>/etc/passwd
## Set user rules in sshd_config
txt="Match User $altuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
"
echo "$txt" >>/etc/ssh/sshd_config
## Copy the public key in the shared folder
mkdir -p "$sharedpath/.ssh"
cp "$pubkey" "$sharedpath/.ssh/"
## Format sftp line
echo "You can now run on the client (adjust paths accordingly):"
echo "sftp -i ${pubkey%.*} $altuser@name.server.top"
Если это сработает, у вас, вероятно, должны быть:
ChrootDirectory / home / jon
pub
в / etc / passwd
просто установлен на / pub
. / home / jon
должен принадлежать root
и быть доступным для записи только root root
.
Вам также понадобится рабочий корневой каталог со всем необходимым в / home / jon
, например bin
(для оболочки), lib
(общий libs), и т. д.
(пароль для преобразования uid-to-name) и так далее.
Скорее всего, вам нужен не ChrootDirectory.
Вместо этого вы можете попытаться создать несколько записей в / etc / passwd
с желаемыми именами пользователей с псевдонимами с разными домашними каталогами в / home / jon. Вы можете назначить те же числовые UID и GID, что и для пользователя jon
.
Я не уверен, что аутентификация с открытым ключом будет работать удовлетворительно. Попробуйте и прокомментируйте.
Вы могли бы, вероятно, (AB) используют опцию autorizedKeyscommand
для получения публичных ключей от всех домашних каталогов, хотя это кажется немного непрактичным.
Что касается Chrooting, внимательно прочитайте ChrootDirectory
. Есть много вещей, которые вам понадобятся внутри Chroot для интерактивных сессий.