2017-03-23 10 views
1

JavaクライアントでJSchを使用してリモートサーバーに接続し、SFTPを使用していくつかのファイルを取得しています。次のコードは問題なく動作しています: -ユーザーを切り替える必要がある場合にJSchからSFTPを使用する

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); 

問題は、サイトポリシーが変更されていることです。このユーザー(上記のuserName)として直接ログオンすることはできません。最初に私の個人ユーザーとしてログオンしてから、SFTPにしたいファイルにアクセスできるユーザーにsuを送信する必要があります。

私はこれを実現するために上記のコードをリファクタリングできるとは思わないので、代わりにシェルまたはexecチャネルを使用して調べ始めました。私はこれまでのところほとんど成功しておらず、Web上で例を見つけることができないようですので、適切な方向へのアドバイスや指導には非常に感謝しています。どうもありがとう。

+0

ありがとうございました。私は間違いなくその記事を見ていきます。私もあなたの懸念に感謝しますが、政策立案者は、ユーザーがそのユーザーに合法的に許可されている限り、ポリシーに違反しないことを私に保証します。私は彼らが私がそのユーザーとして直接ログインできるようにしたいと思っていますが、まあいいえ! –

答えて

2

JSchで直接行うことはできません。しかし、コードの一部を修正すれば、おそらく実行可能です。

私の答えは、サーバが* nixベース(suへの参照によってバックアップされているもの)であり、OpenSSH SFTPサーバを使用していることを前提としています。


あなたのような何かを実行するために、SSH、「EXEC」のチャンネルをオープンする必要があります。

sudo /bin/sftp-server 

をしかし、そのチャネルの上に、あなたはChannelSftpインスタンス、ないを構築する必要があります。

Session.openChannelのような方法を実装する必要があります。これはexecチャネルを開きますが、ChannelSftpを作成します。


背景については、how it's possible to do sudo with WinSCP SFTP clientを参照してください。

FAQは、sudoのパスワードを使用できないと主張していますが、これはWinSCPにも当てはまります。しかし、JSchとのセッションを完全に制御している場合は、パスワードをsudoに送ることができます。

実際のSFTPセッションを開始する前に、ChannelSftp.start()を上書きして、パスワードをチャンネル入力に書き込むことがあります。

SFTPがTTYで動作しないため、requirettyオプションをオフにする必要があります。


一般的に、操作を自動化するためにユーザーを切り替える必要がありますが、これは悪い設計の兆候です。タスクに必要なリソースにアクセスできるアカウントを直接使用する必要があります。

関連する問題