概要
androidでelixirやってみる。
練習問題やってみた。
練習問題
shellserverを起動して、パソコンから、調査せよ。
方針
- ssh使わない。
- vnc使わない。
- 内蔵のターミナル使う。
- chrome使う。
- nano使う。
- ifconfig使う。
- tcpポートは、5300番。
手順
nanoとifconfigをインストール。
sudo apt install nano
sudo apt install net-tools
ipアドレス取得
ifconfig
192.168.0.102
フォルダを掘る。
mkdir elixir
cd elixir
mix new する。
mix new hello
cd hello
mix test
shellserverをコピー
このページをchromeで開く。
defmodule Hello do
@moduledoc """
Documentation for Hello.
"""
@doc """
Hello world.
## Examples
iex> Hello.hello
:world
"""
def hello do
:world
end
require Logger
use GenServer
@port 5300
def start do
GenServer.start(__MODULE__, %{socket: nil})
end
def init(state) do
{:ok, socket} = :gen_tcp.listen(@port, [:binary, active: true])
send(self(), :accept)
Logger.info "Listenn port: #{@port}"
{:ok, %{state | socket: socket}}
end
def handle_info(:accept, %{socket: socket} = state) do
{:ok, _} = :gen_tcp.accept(socket)
Logger.info "Connected"
{:noreply, state}
end
def handle_info({:tcp, socket, data}, state) do
Logger.info "Received: #{String.length(data)}"
Logger.info data
Logger.info "Send"
{result, 0} = System.shell(data)
:ok = :gen_tcp.send(socket, result)
:gen_tcp.close(socket)
send(self(), :accept)
{:noreply, state}
end
def handle_info({:tcp_closed, _}, state) do
Logger.info "Close"
{:stop, :normal, state}
end
def handle_info({:tcp_error, _}, state) do
Logger.info "Error"
{:stop, :normal, state}
end
def run() do
cmd = IO.gets "> "
{:ok, socket} = :gen_tcp.connect('localhost', 5300, [:binary, active: false])
:ok = :gen_tcp.send(socket, cmd)
{:ok, data} = :gen_tcp.recv(socket, 0)
data
|> IO.puts
run()
end
def main(args \\ "") do
Hello.start
run()
end
end
コードをコピー
nanoでlib/hello.exを開く。
nano lib/hello.ex
コードをペースト。
iex起動
iex -S mix
shellserver起動
Hello.main
パソコンから、クライアント起動、調査する。
>tcp1
> ls
README.md
_build
lib
mix.exs
test
> pwd
> ls /
Sever not available!
> ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1 (UNSPEC)
RX packets 2853 bytes 249628 (249.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2853 bytes 249628 (249.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.102 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::220:22ff:fea0:1255 prefixlen 64 scopeid 0x20<link>
inet6 2404:7a83:6460:a760:55ee:aa7d:bf95:ddc4 prefixlen 64 scopeid 0x0<global>
inet6 2404:7a83:6460:a760:220:22ff:fea0:1255 prefixlen 64 scopeid 0x0<global>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 3000 (UNSPEC)
RX packets 29073 bytes 31897928 (31.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11143 bytes 2547048 (2.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
> cat /proc/cpuinfo
> uname -a
Sever not available!
> df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 25752372 4409520 21195396 18% /
> mount
> dpkg
Sever not available!
クライアントは、これ。
以上。