Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Elixir中通过SSH执行命令?_Ssh_Elixir - Fatal编程技术网

如何在Elixir中通过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连接:

: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
modules
exec
命令,该命令将
: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}