1 package org
.argeo
.cli
.fs
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
5 import java
.io
.OutputStream
;
6 import java
.nio
.file
.DirectoryStream
;
7 import java
.nio
.file
.Files
;
8 import java
.nio
.file
.Path
;
10 import java
.util
.Scanner
;
12 import org
.apache
.commons
.io
.IOUtils
;
13 import org
.apache
.commons
.logging
.Log
;
14 import org
.apache
.commons
.logging
.LogFactory
;
15 import org
.apache
.sshd
.agent
.SshAgent
;
16 import org
.apache
.sshd
.agent
.SshAgentFactory
;
17 import org
.apache
.sshd
.agent
.local
.LocalAgentFactory
;
18 import org
.apache
.sshd
.agent
.unix
.UnixAgentFactory
;
19 import org
.apache
.sshd
.client
.SshClient
;
20 import org
.apache
.sshd
.client
.future
.ConnectFuture
;
21 import org
.apache
.sshd
.client
.session
.ClientSession
;
22 import org
.apache
.sshd
.client
.subsystem
.sftp
.fs
.SftpFileSystem
;
23 import org
.apache
.sshd
.client
.subsystem
.sftp
.fs
.SftpFileSystemProvider
;
25 public class SshSync
{
26 private final static Log log
= LogFactory
.getLog(SshSync
.class);
28 public static void main(String
[] args
) {
30 try (SshClient client
= SshClient
.setUpDefaultClient()) {
32 boolean osAgent
= true;
33 SshAgentFactory agentFactory
= osAgent ?
new UnixAgentFactory() : new LocalAgentFactory();
34 // SshAgentFactory agentFactory = new LocalAgentFactory();
35 client
.setAgentFactory(agentFactory
);
36 SshAgent sshAgent
= agentFactory
.createClient(client
);
38 String login
= System
.getProperty("user.name");
39 String host
= "localhost";
43 String keyPath
= "/home/" + login
+ "/.ssh/id_rsa";
44 System
.out
.print(keyPath
+ ": ");
45 Scanner s
= new Scanner(System
.in
);
46 String password
= s
.next();
47 // KeyPair keyPair = ClientIdentityLoader.DEFAULT.loadClientIdentity(keyPath,
48 // FilePasswordProvider.of(password));
49 // sshAgent.addIdentity(keyPair, "NO COMMENT");
52 // List<? extends Map.Entry<PublicKey, String>> identities = sshAgent.getIdentities();
53 // for (Map.Entry<PublicKey, String> entry : identities) {
54 // System.out.println(entry.getValue() + " : " + entry.getKey());
57 ConnectFuture connectFuture
= client
.connect(login
, host
, port
);
58 connectFuture
.await();
59 ClientSession session
= connectFuture
.getSession();
63 // session.addPasswordIdentity(new String(password));
64 session
.auth().verify(1000l);
66 SftpFileSystemProvider fsProvider
= new SftpFileSystemProvider(client
);
68 SftpFileSystem fs
= fsProvider
.newFileSystem(session
);
69 Path testPath
= fs
.getPath("/home/" + login
+ "/tmp");
70 Files
.list(testPath
).forEach(System
.out
::println
);
76 } catch (Exception e
) {
77 // TODO Auto-generated catch block
82 static void test(Path testBase
) {
84 Path testPath
= testBase
.resolve("ssh-test.txt");
85 Files
.createFile(testPath
);
86 log
.debug("Created file " + testPath
);
87 Files
.delete(testPath
);
88 log
.debug("Deleted " + testPath
);
89 String txt
= "TEST\nTEST2\n";
90 byte[] arr
= txt
.getBytes();
91 Files
.write(testPath
, arr
);
92 log
.debug("Wrote " + testPath
);
93 byte[] read
= Files
.readAllBytes(testPath
);
94 log
.debug("Read " + testPath
);
95 Path testDir
= testBase
.resolve("testDir");
96 log
.debug("Resolved " + testDir
);
98 Files
.createDirectory(testDir
);
99 log
.debug("Created directory " + testDir
);
100 Path subsubdir
= Files
.createDirectories(testDir
.resolve("subdir/subsubdir"));
101 log
.debug("Created sub directories " + subsubdir
);
102 Path copiedFile
= testDir
.resolve("copiedFile.txt");
103 log
.debug("Resolved " + copiedFile
);
104 Path relativeCopiedFile
= testDir
.relativize(copiedFile
);
105 log
.debug("Relative copied file " + relativeCopiedFile
);
106 try (OutputStream out
= Files
.newOutputStream(copiedFile
);
107 InputStream in
= Files
.newInputStream(testPath
)) {
108 IOUtils
.copy(in
, out
);
110 log
.debug("Copied " + testPath
+ " to " + copiedFile
);
111 Files
.delete(testPath
);
112 log
.debug("Deleted " + testPath
);
113 byte[] copiedRead
= Files
.readAllBytes(copiedFile
);
114 log
.debug("Read " + copiedFile
);
115 // Browse directories
116 DirectoryStream
<Path
> files
= Files
.newDirectoryStream(testDir
);
118 Path listedFile
= null;
119 for (Path file
: files
) {
121 if (!Files
.isDirectory(file
))
124 log
.debug("Listed " + testDir
);
125 // Generic attributes
126 Map
<String
, Object
> attrs
= Files
.readAttributes(copiedFile
, "*");
127 log
.debug("Read attributes of " + copiedFile
+ ": " + attrs
.keySet());
128 } catch (IOException e
) {
129 // TODO Auto-generated catch block