If you want to add new user using a general SFTP client, it is not possible, because SFTP protocol has no such command.
However, you can implement your custom server command (e.g. users) and then use any SSH client to invoke that command.
The custom command implementation can look like this:
private void CustomCommandUsers(FileServer server, ShellCommandEventArgs e)
{
// check whether current user can manage users
if (e.User.Name != "admin")
{
e.WriteLine("Only 'admin' can manage users.");
return;
}
// when no arguments were specified, display help
if (e.Arguments.Length < 1)
{
e.WriteLine("Options:");
e.WriteLine("-l - Lists all users.");
e.WriteLine("-r <name> - Removes specified user.");
e.WriteLine("-a <name> <pwd> <path> - Adds new user.");
e.WriteLine();
return;
}
FileServerUser user;
switch (e.Arguments[0])
{
// list all users
case "-l":
foreach (var u in server.Users)
{
e.WriteLine(u.Name);
}
break;
// remove specified user
case "-r":
if (e.Arguments.Length < 2)
{
e.WriteLine("Argument <name> required.");
return;
}
user = server.Users[e.Arguments[1]];
if (user == null)
{
e.WriteLine("No such user '{0}'.", e.Arguments[1]);
}
else
{
server.Users.Remove(user);
e.WriteLine("User '{0}' removed.", user.Name);
}
break;
// add specified user
case "-a":
if (e.Arguments.Length < 4)
{
e.WriteLine("Arguments <name>, <password> and <virtualRootPath> required.");
return;
}
user = server.Users[e.Arguments[1]];
if (user != null)
{
e.WriteLine("User '{0}' already exists.", user.Name);
}
else
{
user = new FileServerUser(e.Arguments[1], e.Arguments[2], e.Arguments[3]);
server.Users.Add(user);
e.WriteLine("User '{0}' added.", user.Name);
}
break;
// unknown option
default:
e.WriteLine("Unknown option '{0}'.", e.Arguments[0]);
break;
}
}
To enable remote command, you have to add FileServerProtocol.Shell to the server.
So the CustomCommandUsers can be used like this:
// create server instance
var server = new FileServer();
// bind SFTP and SSH shell to port 22
server.Bind(22, FileServerProtocol.Shell);
server.Bind(22, FileServerProtocol.Sftp);
// add server keys
// ...
// add various defined users (e.g. admin accounts)
server.Users.Add(new FileServerUser("admin", "root", "c:/data"));
// register custom 'users' command
server.ShellCommand += (sender, e) =>
{
if (e.Command == "users")
{
CustomCommandUsers(server, e);
}
};
// start server in the background
server.Start();
You can use any client to invoke the users command (e.g. PuTTY). Using Rebex Terminal emulation, you can do it easily like this:
using (var ssh = new Ssh())
{
ssh.Connect("localhost");
ssh.Login("admin","root");
string response = ssh.RunCommand("users -a tester test c:/data");
Console.WriteLine(response);
}