No Ubuntu / Debian, você pode instalar o shell scponly para restringi-los somente ao scp / sftp. Basta instalar o pacote e alterar seu shell para /usr/bin/scponly :
sudo aptitude install scponly sudo usermod -s /usr/bin/scponly USERNAME
O problema de espaço em disco provavelmente é melhor resolvido com cotas de sistema de arquivos. Infelizmente, tenho pouca experiência com eles.
Se você quiser se tornar mais chique (restringindo tipos de arquivos e tal), você provavelmente precisará escrever seu próprio script para validar os comandos que estão sendo passados do cliente. O script mais simples seria um script de shell que realiza um teste semelhante a este:
if [[ $SSH_ORIGINAL_COMMAND = "scp -f *txt" ]] then exec $SSH_ORIGINAL_COMMAND fi
Isso permitiria o download de arquivos .txt. Testes rápidos indicam que o nome do arquivo não é passado como parte do comando scp durante o envio. Por isso, pode não ser possível nesse caso.
O script seria definido como o comando forçado para a chave do usuário. (O campo '' command="blah" '' em authorized_keys.) Ele também pode ser configurado como a opção "ForceCommand" para um grupo Match em sshd_config, assim:
Corresponder grupo scponly ForceCommand / usr / local / sbin / scpwrapper
Em seguida, adicione os usuários para ficarem restritos ao grupo "scponly".
EDITAR: Por solicitação, aqui está o script que eu uso para impor o acesso apenas ao rsync:
#!/bin/bash
#
# Verify that rsync command appears to be a legitimate rsnapshot command.
# Requires >= bash 3.x
#
# Ben Beuchler
# 6/4/07
# rsync needs to be operating in "server" mode.
re_server='rsync --server'
# Match both -x and --word options
re_options=' +-{1,2}[[:alpha:]-]+'
# Match legal paths
re_paths=' +[-[:alnum:]_./]+'
# Build the full regex
r="^${re_server}(${re_options})+(${re_paths}){2}$"
echo $SSH_ORIGINAL_COMMAND >> ssh_log
if [[ $SSH_ORIGINAL_COMMAND =~ $r ]]
then
exec $SSH_ORIGINAL_COMMAND
else
echo "Invalid rsync command."
fi
Use esse script como um comando forçado (por "command=" em ~ / .ssh / authorized_keys ou usando um bloco "Match" em sshd_config como mencionado acima) e ele rejeitará tudo, exceto os comandos rsync. Com um pequeno ajuste, pode ser feito apenas aceitar comandos rsync específicos.