Usando JSch para SFTP quando é necessário também alternar o usuário

Eu estou usando o JSch em um cliente Java para se conectar a um servidor remoto e obter alguns arquivos usando o SFTP. O código a seguir tem funcionado bem para mim:

JSch ssh = new JSch(); JSch.setConfig(FileTransferConstants.STRICT_HOST_KEY_CHECKING, FileTransferConstants.NO); Session session = ssh.getSession(userName, host, port); session.setPassword(password); session.connect(); Channel channel = session.openChannel(FileTransferConstants.SFTP); channel.connect(); ChannelSftp sftp = (ChannelSftp) channel; sftp.cd(remoteDirectoryPath); sftp.lcd(localDirectoryPath); sftp.get(remoteDirectoryPath + remoteFileName, remoteFileName); 

O problema é que agora houve uma mudança na política do site. Eu não tenho mais permissão para fazer logon diretamente como este usuário (userName acima). Devo primeiro fazer logon como meu usuário pessoal e, em seguida, su para o usuário que tem access aos arquivos que eu quero SFTP.

Eu não acho que haja de qualquer maneira eu posso refatorar o código acima para conseguir isso e então eu comecei a olhar para o uso de um shell ou de um canal exec. Eu tive pouco sucesso até agora e não consigo encontrar nenhum exemplo na web, então eu ficaria muito grato por qualquer conselho ou indicações na direção certa. Muito Obrigado.

Eu não acho que você possa fazer isso diretamente com o JSch. Mas com alguma modificação do seu código, provavelmente é factível.

Note que minha resposta assume que o servidor é baseado em nix (o que é apoiado por sua referência ao su ) e usa o servidor OpenSSH SFTP.


Você precisa abrir o canal “exec” do SSH para executar algo como:

 sudo /bin/sftp-server 

Mas no topo desse canal, você precisa criar a instância do ChannelSftp , não o ChannelExec .

Portanto, você precisará implementar o método Session.openChannel , que abrirá o canal exec , mas criará o ChannelSftp para ele.


Para alguns antecedentes, veja como é possível fazer o sudo com o cliente WinSCP SFTP .

Observe que, embora a FAQ indique que você não poderá usar a senha do sudo , isso é verdadeiro para o WinSCP. Mas como você tem um controle total da session com o JSch, você pode ser capaz de alimentar a senha para o sudo .

Para isso, você pode replace o ChannelSftp.start() para gravar a senha na input do canal, antes de iniciar a session SFTP real.

Você ainda precisa que a opção requiretty esteja desativada, pois o SFTP não pode funcionar com o TTY.


Geralmente uma necessidade de mudar o usuário para automatizar alguma operação, é um sinal de um projeto defeituoso. Você deve usar diretamente uma conta que tenha access aos resources necessários para a tarefa.