2020年12月22日火曜日

 


Raspberyy Pi で SSH


参照:https://qiita.com/tomokin966/items/bc22d09f97ebeb3955d2

試してみよう。


環境

ハード

  • ディスプレイ、マウス、キーボードを繋いである Raspberry Pi 3 Model B+
  • Windows10が入ったマシン

ネットワーク

  • 同一ローカルネットワークに接続済み

SSHとは?

Secure Shell(セキュアシェル、SSH)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。
Secure Shell - Wikipedia より引用

暗号化とか認証とかを使って安全にリモートコンピュータに接続する仕組み。
その名の通り、シェルのセキュアなやつ。

パスワードによるベーシック認証も使えるが、基本的には公開鍵暗号を使って鍵で接続することが多い。

一通り設定が済んだらベーシック認証を無効化しておくのが吉。

Raspberry PiでSSHの設定をする。

Windows 10からRaspberry PiにSSH接続してみる(公開鍵認証) - いろいろ試してみる

基本的にはここを参照する。

1. SSHディレクトリを作る

Raspberry Piで以下のコマンドを実行。

sudo mkdir /boot/ssh

フォルダは空でOK。

2. 「設定」→「Raspberry Piの設定」からSSHを有効に

2019-06-05-15-07-25.png

最近のRaspbianはデフォルトだとオフになってるらしい。

3.「設定」→「Raspberry Piの設定」からパスワードを変更

2019-06-05-15-11-41.png

パスワードを変更する。
デフォルトは以下の通り。

UserPassword
piraspberry

パスワード変更したら、一回再起動しとく
sudo reboot

3. WinSCPから接続してみる

2019-06-05-15-34-13.png

以下の情報を入力して接続してみる。

ホスト名:IPアドレスかホスト名
ポート番号:変更していれば入力(デフォルトは22)
ユーザー名:pi
パスワード:さっき変えたやつ

繋がったらベーシック認証は設定完了。

4. 鍵を使って接続できるようにする

OpenSSHをインストールする。(Gitをインストールしてればついてきてるはず)

Git Bashから以下のコマンドを実行。(pathを通していればコマンドプロンプトでも可)

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

your_email@example.comは任意の値に変える。
(別にメールアドレスじゃなくてもいいけど、メールアドレスがベター)

保存先とかパスワードを求められるけど、何も入力せずEnter。

C:\Users\ユーザ名\.sshに「id_sra」(秘密鍵)と「id_rsa.pub」(公開鍵)が作られる。

WinSCPで「id_rsa.pub」(公開鍵)をRaspberry Piにアップロードする。

5. Raspberry Piに公開鍵を登録する

1)authorized_keys をテキストエディタで作っておく。
2)そのなかにid_rsa.pubの中身をペースト。
3)sshd_configの中身を下のとおり編集する

最後に、sudo service ssh restart 
rebootでもOKだが、service restratのほうがスマートかも。
# ホームディレクトリへ移動
cd ~

# 公開鍵をRaspberry Pi側に登録
mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys

# 権限を設定
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

※権限の設定を間違うと接続できないので注意!

SSHの設定を変更するために設定ファイルを編集する。

編集前に設定ファイルの権限を一時的に変更する。

sudo chmod 777 /etc/ssh/sshd_config

これでWinSCPからでも編集できるようになる。

#PubkeyAuthentication yesのコメントアウトを外す。
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2のコメントアウトを外す

#PubkeyAuthentication yes

#AuthorizedKeysFile  .ssh/authorized_keys .ssh/authorized_keys2

PubkeyAuthentication yes

AuthorizedKeysFile  .ssh/authorized_keys .ssh/authorized_keys2

って感じに変更する。

6. ベーシック認証を無効にする

#PasswordAuthentication yesのコメントアウトを外し、noに書きかえる。

#PasswordAuthentication yes

PasswordAuthentication no

って感じに変更する。

設定ファイルの編集が終わったらパーミッションを戻す。
sudo chmod 644 /etc/ssh/sshd_config

7. パーミッションを確認する。

以下のディレクトリやファイルのパーミッションを確認しておく。
1つでも間違っていると接続できないので注意!

ディレクトリパーミッション
.ssh700
.ssh/authorized_keys600
/etc/ssh/sshd_config644

確認するのがめんどい場合は下のコマンドを流す。

cd
sudo chmod 700 .ssh
sudo chmod 600 .ssh/authorized_keys
sudo chmod 644 /etc/ssh/sshd_config

最後に再起動しておく。
sudo reboot



参照第2弾https://584homes.com/it/raspberry-pi/raspberry-ssh1802.html%20=




Raspberry Piに安全にSSHログインできる公開鍵認証の設定方法

パスワードログインはランダムで試すことで突破されることもあるので、公開鍵認証を行いました。
この設定を行うことでセキュリティの向上が期待できます。

公開鍵認証は秘密鍵を持つ人だけがログインできるようになる設定です。

2018/02/18 時点の Raspberry Pi 3 の環境で設定を行いました。

 

まず公開鍵と秘密鍵を作成します。
今回は Windows 環境で鍵を作成するため TeraTerm を使用しました。

Mac ユーザ等は ssh-keygen コマンドで生成できます。

 

公開鍵と秘密鍵の作成

  1. TeraTerm を起動して、[設定]-[SSH鍵生成] をクリック
    TeraTerm を起動して、[設定]-[SSH鍵生成] をクリック

  2. [鍵の種類] は “RSA” を選択して、[ビット数] は “2048” を入力
    [生成] をクリック
    [鍵の種類] は "RSA" を選択して、[ビット数] は "2048" を入力

  3. 「鍵を生成しました。」と出力される
  4. [鍵のパスフレーズ]、[パスフレーズの確認] にパスワードを入力
    [公開鍵の保存] と [秘密鍵の保存] をクリックして、それぞれの鍵を保存する
    ※鍵のパスフレーズ無しの場合は秘密鍵だけでログインします
    [公開鍵の保存] と [秘密鍵の保存] をクリックして、それぞれの鍵を保存する

この設定完了後に秘密鍵(id_rsa)を無くすとログインできなくなるため気をつけてください。
また、秘密鍵が第三者に漏洩すると、ラズパイにログインされてしまうので厳重に保管してください。

 

公開鍵を Raspberry Pi に保存

  1. ラズパイにログインする
  2. ホームディレクトリに .ssh ディレクトリを作成

    cd
    mkdir .ssh

  3. .ssh のパーミッションを変更

    chmod 700 .ssh

  4. .ssh ディレクトリの下に公開鍵ファイルを作成して開く

    vi ~/.ssh/authorized_keys

  5. 保存した “id_rsa.pub” をテキストエディタで開いてコピーする
    保存した "id_rsa.pub" をテキストエディタで開いてコピーする

  6. コピーして文字列を ~/.ssh/authorized_keys にペーストして保存する
    ※ペーストする前に [i] を入力して入力モードにするのを忘れずに!
    コピーして文字列を ~/.ssh/authorized_keys にペーストして保存する

  7. authorized_keys のパーミッションを変更

    chmod 600 ~/.ssh/authorized_keys

 

SSH の設定変更

  1. sshd_config のバックアップ

    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.yyyyMMdd

    ※yyyyMMdd は日付を入力

  2. sshd_config を開く

    sudo vi /etc/ssh/sshd_config

  3. “#PasswordAuthentication yes” の下の行に “#PasswordAuthentication no” を追加して保存する
    "#PasswordAuthentication yes" の下の行に "#PasswordAuthentication no" を追加して保存する
  4. SSH の再起動

    sudo service ssh restart

    これでパスワードログインが出来なくなり、秘密鍵を持っている人だけがログインできます。

 

 

おまけ:Teraterm のマクロを使って簡単ログイン

以下の内容を記載した “xxxx.ttl” ファイルを作成する

username = ‘ログインユーザ名’
hostname = ‘ログイン先のIPアドレス(例:192.168.0.1)’
keyfile = ‘ローカルに保存された秘密鍵のパス’
portnum = ‘ポート番号’

msg = hostname
strconcat msg ‘:22 /ssh /auth=publickey /user=’
strconcat msg username
strconcat msg ‘ /keyfile=’
strconcat msg keyfile
connect msg

.ttl ファイルを “Tera Term Macro Interpreter(C:\Program Files\teraterm\ttpmacro.exe)” で起動するように設定
.ttl ファイルを "Tera Term Macro Interpreter(C:\Program Files\teraterm\ttpmacro.exe)" で起動するように設定

xxxx.ttl をダブルクリックするとログインできるようになります。

2020年11月8日日曜日

Raspberry Pi LazでGPIO

Raspberry Pi LazでGPIO


https://wiki.freepascal.org/Lazarus_on_Raspberry_Piが大元の情報



http://izawa-web.com/lazarus/lazarus.html (参照です 

Lazarus 

GPIO  参考


■ Raspberry Pi (ラズベリー・パイ) で Lazarus (FreePascal)

ほぼ Delphi ですね。

インストールは、コマンドラインに、次のコマンドを入力するだけでいけました。(結構時間がかかります。)

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install fpc
sudo apt-get install lazarus
sudo apt-get install libfbclient2

プログラム(例えば、projetc1)の起動は、
sudo ./project1
なんですね。



■ rpi_hal ユニットで、i2c を使う

 ADS1015(12ビット4チャンネルAD変換)を使ってみました。

 rpi_hal.pas ユニットを使っています。
 そのままでは、ランタイムエラーで起動できないので、
 メニュー-プロジェクト-プロジェクトオプション-コンパイラオプション-その他 のカスタムオプションに、
-dUseCThreads を追加します。
 終了時にエラー(例外クラス)が出る場合は、Uses 節の cmem をコメントアウトします。



unit ads1015Unit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls,
  // 追加ユニット
  rpi_hal, cthreads, Unix;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Edit1: TEdit;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  s : string;
  ret : integer;
  v : double;
begin
  
  // $48 : ADS1015_I2C_ADDRESS
  // $01 : ADS1015_REG_POINTER_CONFIG
  // $00 : ADS1015_REG_POINTER_CONVERT
  // $F183 : 3CHを±6.144V (Gain 2/3) で変換 (0CH = $C183, 1CH = $D183, 2CH = $E183)
  // ±4.096V (Gain 1) の時は、 $F183 or $0200
  // 実際には、最大 VDD + 0.3V までしか測定できない
  
  i2c_string_write($48$01, #$F1 + #$83 , NO_TEST);
  sleep(1); // 変換待ち
  s := i2c_string_read($48$002, NO_TEST);
  if Length(s) >= 2 then begin
     ret := StrToInt('$' + IntToHex(Ord(s[1]), 2) + IntToHex(Ord(s[2]), 2));
     // 下位 4 ビットは無関係
     ret := ret shr 4;
     v := ret * ((6.144 2) / 4096);
     Edit1.Text := Format('%.3f', [v]);
  end;
end;
 
end.

■ PiGpio ユニットを使ってステッピングモーターを制御

 ステッピングモーター: ST-42BYG0506H (1回転ステップ数:200 基本ステップ角:1.8度)
 ドライバIC: TB6674PG
 ※TB6674PG(TA7774P互換)と、TA7774PGの違い
  
TB6674PG : モータ電源 Vs1A、Vs1B > 6.5V (標準12V)必要
  TA7774PG : モータ電源 Vs1A、Vs1B >= Vcc でOK

unit Unit4;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  // 追加ユニット
  PiGpio;
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  GPIO_Driver : TIoDriver;
  Gpf : TIoPort;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormActivate(Sender: TObject);
begin
  if GPIO_Driver.MapIo then begin
    Gpf := GpIo_Driver.CreatePort(GPIO_BASE, CLOCK_BASE, GPIO_PWM);
 
    // GPIO20, 21, 16 を OUTPUT に
    // ICの 3 番ピンに接続(A)
    Gpf.SetPinMode(20, OUTPUT);
    // ICの 6 番ピンに接続(B)
    Gpf.SetPinMode(21, OUTPUT);
 
    // ICの 8 番ピンに接続(L:スタンバイ/ H:オペレーション)
    Gpf.SetPinMode(16, OUTPUT);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  msec : integer;
begin
  if Gpf <> nil then begin
    msec := 10;
    Gpf.SetBit(16); // オペレーション
     // 200 ステップのモーターで、1回転
    for i := 0 to 49 do begin
      Gpf.ClearBit(20);
      Gpf.ClearBit(21);
      sleep(msec);
      Gpf.SetBit(20);
      Gpf.ClearBit(21);
      sleep(msec);
      Gpf.SetBit(20);
      Gpf.SetBit(21);
      sleep(msec);
      Gpf.ClearBit(20);
      Gpf.SetBit(21);
      sleep(msec);
    end;
    Gpf.ClearBit(20);
    Gpf.ClearBit(21);
    Gpf.ClearBit(16); // スタンバイ
   end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i:integer;
  msec : integer;
begin
  if Gpf <> nil then begin
    msec := 10;
    Gpf.SetBit(16); // オペレーション
     // 200 ステップのモーターで、1回転
    for i := 0 to 49 do begin
      Gpf.ClearBit(20);
      Gpf.ClearBit(21);
      sleep(msec);
      Gpf.ClearBit(20);
      Gpf.SetBit(21);
      sleep(msec);
      Gpf.SetBit(20);
      Gpf.SetBit(21);
      sleep(msec);
      Gpf.SetBit(20);
      Gpf.ClearBit(21);
      sleep(msec);
    end;
    Gpf.ClearBit(20);
    Gpf.ClearBit(21);
    Gpf.ClearBit(16); // スタンバイ
  end;
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  if Gpf <> nil then begin
    Gpf.ClearBit(20);
    Gpf.ClearBit(21);
    Gpf.ClearBit(16);
    GpIo_Driver.UnmapIoRegisrty(Gpf);
  end;
end;
 
end.