B4A Library Android SFTP based on JSch tutorial

JSch is an open source Java implementation of SSH2. It supports many features.

Currently the Basic4android JSch library supports the SFTP protocol which is SSH File Transfer Protocol or Secured File Transfer Protocol.

SFTP is similar to FTP with the difference that the communication is done over a secured channel.

A good tutorial about SSH authentication is available here: SSH Host Key Protection | Symantec Connect Community

When the client first connects to the SSH server he needs to approve the host key (unless it is in the list of approved keys).

SS-2013-03-05_12.08.04.png


The SFtp object raises a PromptYesNo event for this question:
B4X:
Sub sftp1_PromptYesNo (Message As String)
   Dim res As Int = Msgbox2(Message, "", "Yes", "", "No", Null)
   'The next line might be a bit confusing. It is a condition.
   'The value will be True if res equals to DialogResponse.POSITIVE.
   sftp1.SetPromptResult(res = DialogResponse.POSITIVE)
End Sub
The network thread will wait until you call SetPromptResult or after 60 seconds. In the later case the result will be False.

If you want to automatically accept the host key (which should only be done in a secured local network) then you can write:
B4X:
Sub sftp1_PromptYesNo (Message As String)
   sftp1.SetPromptResult(True)
End Sub

Sftp should be declared as a process global variable and initialized in Activity_Create (or Service_Create):
B4X:
Sub Activity_Create(FirstTime As Boolean)
   If FirstTime Then
      sftp1.Initialize("sftp1", "username", "password", "example.com", 22)
      sftp1.SetKnownHostsStore(File.DirInternal, "hosts.txt")
   End If
   Activity.LoadLayout("1")
End Sub

Calling SetKnownHostsStore sets a file that will save the known keys. Without it the user will need to approve the key each time.

In Activity_Resume we need to call SFtp.Activity_Resume:
B4X:
Sub Activity_Resume
   sftp1.Activity_Resume
End Sub
The purpose of this call is to redisplay the visible prompt if it was visible when the activity was paused. This is relevant for example when the user changes the orientation while the dialog is visible.

SFtp can also show a message to the user in some cases. This is done with the ShowMessage event:
B4X:
Sub sftp1_ShowMessage (Message As String)
   Msgbox(Message, "")
End Sub

The other methods work in the same way as the FTP object: Android FTP tutorial

The library is attached. The open source project is embedded in the jar file.

Updates:
1.31 - New Rmdir method - deletes empty folders.
1.30 - Based on the latest version of Jsch (0.1.54).
 

Attachments

  • JSch.zip
    274.1 KB · Views: 210
Last edited:

MarcRB

Active Member
Licensed User
Longtime User
I found the mistake:

I previous used FTP instead of SFTP. I changed my code to use SFTP by Jsch.
During that change I didn't noticed that the listcompleted event at sftp was slightly different from the listcompleted event at ftp.
Because it has two parameters that contains Sftp instead of ftp. The example was working well because it was changed to sftp.

The message pointed me to the sftp certificate because of the word 'signature'.
Now I know signature is also used to name the event with its arguments.

Case solved!
 

Knoppi

Active Member
Licensed User
Longtime User
Wishes: (B4A and B4J)
  • authentication with pre-shared key
  • AppendFile
  • SendCommand
it would be great if that with sftp would be possible
 

Nozavi

New Member
Licensed User
Longtime User
Sooo it's not possible to use this library to send remote commands? After all, that's a key feature of SFTP connections...
 

serg992313

Member
Please advise, how can I delete empty folder from sFTP server. I've tried sftp.DeleteFile (/upload/123/), where "123" is folder for delete, but without success.
 

vecino

Well-Known Member
Licensed User
Longtime User
Please advise, how can I delete empty folder from sFTP server. I've tried sftp.DeleteFile (/upload/123/), where "123" is folder for delete, but without success.
Do you have permission to delete it?
 
Top