如何在Elixir中通过SSH执行命令?
我知道我可以打开到远程服务器的ssh连接:如何在Elixir中通过SSH执行命令?,ssh,elixir,Ssh,Elixir,我知道我可以打开到远程服务器的ssh连接: :ssh.start :ssh.connect("11.22.33.44", 22, user: "my_login123") 但我如何才能真正发送命令并从中接收响应呢?我不是指交互模式,我只想发送命令并接收回复。使用像SSHex这样的长生不老药库可能更容易,因为它实际上使用了erlang:ssh库,但它提供了更好的界面,并且使您更容易完成所要完成的任务 例如,自述文件 {:ok, conn} = SSHEx.connect ip: '123.123
:ssh.start
:ssh.connect("11.22.33.44", 22, user: "my_login123")
但我如何才能真正发送命令并从中接收响应呢?我不是指交互模式,我只想发送命令并接收回复。使用像SSHex这样的长生不老药库可能更容易,因为它实际上使用了erlang:ssh库,但它提供了更好的界面,并且使您更容易完成所要完成的任务 例如,自述文件
{:ok, conn} = SSHEx.connect ip: '123.123.123.123', user: 'myuser'
SSHEx.cmd! conn, 'mkdir -p /path/to/newdir'
res = SSHEx.cmd! conn, 'ls /some/path'
其中,res
的值将是来自命令的响应
编辑
但是,如果设置为使用:ssh。然后需要使用:ssh\u connection
modulesexec
命令,该命令将:ssh
连接作为参数
有关如何执行此操作的更多详细信息,请参阅此部分。使用SSHex可以非常方便地构建SSH连接
下面是一个例子:
defmodule SshDemo do
@moduledoc false
def connect do
{:ok, conn} = SSHEx.connect ip: 'xxx.xxx.xxx.xxx', user: 'root', password: 'xxxxx'
SSHEx.cmd! conn, 'mkdir -p newdir'
end
end
如果使用mix创建项目。您只需在mix.exs文件中添加依赖项,然后运行--“mix deps.get”
然后,您可以编译这个模块。使用--混合deps.compile“。
运行上面的示例将在~/path中创建一个名为newdir的文件夹
下面是一个只使用
:ssh而不使用外部库的示例。要运行它,您需要在目标主机上进行设置。有关更多信息,请阅读Erlang
ssh-connect.exs
它可能值得一看,因为它是用长生不老药写的,自述文件提供了您需要的功能。@harrison lucas,它使用:ssh,有什么区别?您有标签,您没有标签,您问的是纯erlang问题,拒绝了@harrison lucas提供的完全正确的长生不老药特定答案。这真是一团糟?我怎样才能在纯“:ssh”中做到这一点?
defp deps do
[{:sshex, "2.1.2"}]
end
#! /usr/bin/env elixir
:ssh.start()
{:ok, conn} = :ssh.connect('raspi', 22,
silently_accept_hosts: true,
user: System.get_env("USER") |> to_charlist(),
user_dir: Path.join(System.user_home!(), ".ssh") |> to_charlist(),
user_interaction: false,
)
{:ok, chan} = :ssh_connection.session_channel(conn, :infinity)
:success = :ssh_connection.exec(conn, chan, 'uname -a', :infinity)
for _ <- 0..3 do
receive do
{:ssh_cm, ^conn, value} -> IO.inspect(value)
end
end
:ok = :ssh.close(conn)
{:data, 0, 0, "Linux raspberrypi 4.4.50+ #970 Mon Feb 20 19:12:50 GMT 2017 armv6l GNU/Linux\n"}
{:eof, 0}
{:exit_status, 0, 0}
{:closed, 0}