#ssh #execute-command #host #remote #connection #sshkit #ssh-kit

sshkit_rs

一个用于通过SSH在远程主机上执行命令的Rust库

1个不稳定版本

0.1.0 2023年4月4日

#45#execute-command

MIT 许可证

52KB
687

SSHKit.rs

SSHKit.rs是一个Rust库,灵感来源于Ruby版本。SSHKit.rs提供了一个易于使用的接口,用于通过SSH与远程服务器交互。它旨在简化常见的SSH操作,如执行命令、上传和下载文件以及管理对远程主机的连接。

该库旨在简单且强大,提供了一个高级接口以执行复杂任务,同时对于初学者来说仍然易于使用。它建立在流行的SSH2库之上,该库为安全的可靠SSH通信提供了坚实的基础。

使用SSHKit.rs的一个主要优点是其异步设计,这允许同时管理多个连接,从而大大提高了性能和可扩展性。此外,它提供了一个灵活且可扩展的架构,可以轻松定制以适应特定的用例或需求。

总的来说,SSHKit.rs是开发人员执行SSH远程操作的有价值工具,无论用于自动化部署、配置管理还是其他用例。

示例

以下是您可以使用SSHKit.rs的一些示例

在所有主机上执行简单命令

let sshkit = SshKit::new();
let server = Host::new("127.0.0.1", "killix", None).with_password("password");
let cmd = CommandBuilder::new("ls -la");

let exec_mode = ExecMode::Sequential(Some(Duration::from_secs(5)));
let results = sshkit.on(server.clone()).execute(cmd, exec_mode).await?;

for result in results {
    for (host, output) in result {
        println!("Output from {}: {:?}", host.address, output);
    }
}

在所有主机上执行多个命令,同时设置多个环境变量

let cmd = CommandBuilder::new("printenv")
    .add_command("ls -la /etc")

在所有主机上执行命令,同时设置多个环境变量

let cmd = CommandBuilder::new("printenv")
    .with_env("VAR1", "value1")
    .with_env("VAR2", "value2");

在特定目录中的所有主机上执行命令

let cmd = CommandBuilder::new("printenv")
    .with_in("/remote/path")

使用sudo并根据给定的用户和组提升权限,在所有主机上执行命令

let cmd = CommandBuilder::new("printenv")
    .as_user("admin")

将文件或目录上传到所有主机

let sshkit = SshKit::new();
let server = Host::new("127.0.0.1", "killix", None).with_password("password");
let file_opts = FileOptions::new("/path/to/remote/file").with_local_path("/path/to/local/file", );

ssh_kit
  .on(server)
  .upload(file_opts);

从所有主机下载文件或目录

let sshkit = SshKit::new();
let server = Host::new("127.0.0.1", "killix", None).with_password("password");
let file_opts = FileOptions::new("/path/to/remote/file").with_local_path("/path/to/local/file", );

ssh_kit
  .on(server)
  .download(file_opts);

测试所有主机上文件或目录的存在性

let sshkit = SshKit::new();
let server = Host::new("127.0.0.1", "killix", None).with_password("password");
let cmd = CommandBuilder::new("node -v");

let exec_mode = ExecMode::Sequential(None);
let results = sshkit.on(server.clone()).test(cmd, exec_mode).await?;

for result in results {
    for (host, output) in result {
        println!("Output from {}: {:?}", host.address, output);
    }
}

执行模式

The ExecMode枚举定义了在多个主机上运行命令的不同执行模式。它有三个变体

  • 顺序:依次在每台主机上运行命令。它包含一个可选的持续时间参数,该参数指定在超时之前等待命令完成的最大时间。
  • 并行:在所有主机上并行运行命令。
  • 分组:将主机分成组,并在每个组中并行运行命令。它包含一个usize参数,指定每组中的主机数量,以及一个可选的持续时间参数,该参数指定在超时之前等待命令完成的最大时间。

连接池

SSHKit.rs使用简单的连接池来减少协商新SSH连接的开销。默认情况下,如果一个连接超过30秒未被使用,它将被新的连接替换。这个超时时间可以针对每个服务器进行自定义。

贡献

欢迎并向SSHKit.rs做出贡献!要贡献,请按照以下步骤操作

  1. 在GitHub上 Fork 仓库。
  2. 为您的更改创建一个新的分支。
  3. 对您的更改进行修改,并将其提交到您的分支。
  4. 创建一个拉取请求,将您的更改合并到主分支。

在提交拉取请求之前,请确保您的代码遵循Rust编码标准,并且所有测试都通过。另外,如果您正在引入新功能,请相应地更新文档和示例。

我们期待与您在这个项目上进行合作!

许可协议

SSHKit.rs在MIT许可协议下发布。

依赖项

~7–15MB
~166K SLoC