それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

dpkg-reconfigureなどでダイアログ以外を選択して表示スタイルを変えたい。

dpkg の選択肢の表示を変えたい。

dpkg の選択肢の表示をダイアログじゃなく、単なるテキストの文字列入力でやりたい。

ncursesで作られてると思われるDialogは日本語で表示が乱れたり、tty設定が甘くて表示が崩れたり、シリアルコンソールでうまく行かなかったり。

表示は文字列だし、選択も文字列なんだから、単純に文字列を表示して、文字列をreadしてくれたらいいのにと思ってた。調べてみたら。簡単にできるじゃん。

dialog

ダイアログを選んでいると、選択をキーボードで入れることになる。

f:id:takuya_1st:20211123043445p:plain

readline

readlineを入れると、標準出入力で渡すことができる。

dpkg -f readline 

f:id:takuya_1st:20211123043458p:plain

nointeractive もいいけど。

readlineも使いやすいよ。

デザインが崩れるとき。

diaglog ( curses / ncurses ) とかでtty で「デザインが崩れる」ときは、 --frontend=readline / -f readlineで指定すれば、問題が解決しそうですね。

設定の確認

takuya@:~$ sudo debconf-show debconf
  debconf-apt-progress/title:
  debconf-apt-progress/info:
  debconf/frontend: Dialog
  debconf-apt-progress/media-change:
  debconf/priority: high
  debconf-apt-progress/preparing:

ちなみに、ダイアログの一覧は、 debconf-get-selectionsで見れる。

debconf-utils を入れないといけないが、手軽に、設定をもう一度呼び出すことができて便利である。

sudo apt install debconf-utils
takuya@:~$ debconf-get-selections | grep -v ^# | cut -f 2 | cut -d / -f 1 | sort | uniq
debconf: DbDriver "passwords" warning: could not open /var/cache/debconf/passwords.dat: Permission denied
adduser
apparmor
apt-listchanges
base-passwd
ca-certificates
certbot
console-setup
cpufrequtils
cryptsetup
cryptsetup-initramfs
dash
debconf
debian-installer
dictionaries-common
discover
exim4
exim4-base
exim4-daemon-light
fontconfig
gdm3
glibc
grub2
iproute2
keyboard-configuration
libpam-modules
libpam-runtime
libpam0g
libpaper
libraries
libssl1.1
libvirt-daemon-system
lightdm
linux-base
locales
make-ssl-cert
man-db
mariadb-server-10.5
mdadm
netselect
nginx
openssh-server
passwd
popularity-contest
s-nail
samba-common
sane-utils
shared
shim
tasksel
tzdata
ucf
unattended-upgrades
update-inetd
xserver-xorg-legacy

2022-01-17

ダイアログの設定の選択をがあるものをリストする方法を追加。

参考資料

https://askubuntu.com/questions/667493/change-of-graphical-text-interface-to-completly-text-interface#:~:text=From%20man%20dpkg-reconfigure%3A%20-ftype%2C%20--frontend%3Dtype%20Select%20the%20frontend,so%20you%20actually%20get%20to%20reconfigure%20the%20package.

https://tokyodebian-team.pages.debian.net/html2005/debianmeetingresume2005-fuyuse2.html

rootFSにluks + LVM を用いたときのfstrim

fstrim / discard できない

luks + lvm で構成された root ファイルシステムは、fstrim ができない

$ sudo fstrim -v / 
Operation not permitted.

対策。

discardオプションを使って dmsetup する。

設定 /etc/crypttab

ubuntu_dm_crypt-0 UUID=4aa....  none  discard,luks

設定2 lvm.conf

issue_discards=1

設定3 /etc/fstab

UUID=XXX-XXX/ ext4 defaults,discard 0 0

fstab に discard を書くと、fstrim しなくても rm 実行時に fsrtrim が走る。rm が遅くなる諸刃の剣。

設定2,3について

LUKS しているなら、 crypttab は必須。

lvm.conf のissue_discardは、fstabをdiscardが優先される。 fstabにdiscardを書いていたらlvm.conf記載がなくてもfstrim できる。

個人的には、 fstab でいいと思う。discardでマウントしても、nvmeのディスクのrm速度は気にならない。

参考資料

apt installed automatice のなぜ(Why)をしり、どこからインストールされたかをたどる。

apt installed automatice のなぜ(Why)をしり、どこからインストールされたかをたどる。依存関係

どこでイントールされたんだお前は。

インストール済み/自動installed / automatic って出てくるけど、どこからインストールされたのか知りたい。

apt-chache を使います。

apt-cache --installed rdepends パッケージ名

"apt-cache --installed rdepends XXX" のXXX部分に検索したいものを入れると、XXXに依存するYYYが見られる。installed をつけることで、「どいつがインストールしたのかを見ることができる。

takuya@:~$ apt-cache --installed rdepends bsd-mailx
bsd-mailx
Reverse Depends:
  unattended-upgrades
 |logrotate
 |automysqlbackup

rdepends という、キーワードがポイント。

Google検索ではrdpendsを検索しても出てこない。 rdepends は 'depends'のミス・スペリングだと、怒られて検索結果を丸められちゃうので、"rdepends"は全くGoogleで検索できない。Googleひどい

古えの技術

むかしは、依存関係を知るなら、aptitutde がwhy が便利だった。名前の通り why を調べられた。

aptuide why bsd-mailx

aptitude は最近使われない。apt に切り替わったけど、whyやrdepends がなくて困りますね。

apt にはなかった

man apt で調べたけどなかった

2022-01-09

rdepends では、Google検索でインデックスされてないことに気づいた。まじでどうなってんだろう。

キーワードを散りばめないと検索されない。

たとえば、ソースコードの引用部分は絶対に検索されない。

参考資料

さくっとメールを送るコマンド mailx(s-nail/bsd-mailx)

コマンドからサクッとメールを送信する。

コマンドからサクッとメールを送信して、送信テストをしたい。

コマンドには幾つか候補がある。

  • mailx がある。
  • s-nail がある。
  • mailutilsがある。
  • curl がある。
  • swaks がある。

これらを自由に選んで、メール送信をテストすることができる。

mailxは最初からインストールされているので手軽に試せる。

互換性がある。

mailx と s-nail は互換性がある。

mailx は外部のSMTPなどに非対応(未対応ではなく非対応)

MTA(外部サーバ・ポート)を指定する場合はs-nailを使う

mailx の場合

mailx は linuxでは bsd-mailx で存在する。

## 通常はインストール済みで、apt は不要
# sudo apt install bsd-mailx

mailxでメール送信

echo hi | mailx root
echo hi | mailx takuya

mailx を使うと、sendmail 経由で楽にメールを送れる。

bsd-mailx は初期導入済み

そもそも、私の環境に、なぜbsd-mailx は入っていたのか。

$ apt-cache --installed rdepends bsd-mailx
bsd-mailx
Reverse Depends:
  unattended-upgrades
 |logrotate
 |automysqlbackup 

logrotate と一緒に入っている。

logrotate で使われるので、初期インストールで、インストール済みであるはず。

mailx の実体。

mailxコマンドは、Aliasになっていて、初期設定の場合は bsd-mailxを指している。

takuya@:~$ ll /usr/bin/mailx
lrwxrwxrwx 1 root root 23 11月 18 16:53 /usr/bin/mailx -> /etc/alternatives/mailx

管理しているのは alternatives

takuya@:~$ sudo update-alternatives --config mailx
リンクグループ mailx に 1 つの alternative のみがあります (/usr/bin/mailx が提供): /usr/bin/bsd-mailx
設定は行いません。

smtp を指定するならs-nail

s-nailを使えば、SMTPサーバーを指定することができる。ポート番号やSMTP-AUTHを使える。メールの送信のチェックなら s-nailがmailxより高機能で使いやすい

sudo apt install s-nail 

s-nail で送信。

echo hi | s-nail root
echo hi | s-nail takuya

s-nail でSMTP経由でメールを送る

コマンドでSMTP経由でメール配送できる。

echo Hi success? | s-nail  \
   -S mta=smtp://localhost:25255 \
   -S smtp-auth=none  \
  -S v15-compat=yes \
   takuya@example.com

-S でオプションを指定できる。

s-nail はmailx互換性あるみたい

使い方を見ればわかるが、mailxと互換性がありそう。

しかし、alternativesには出てこない。

alternatives に登録する

mailxとs-nail はほぼ同じだし、alternativesでmailxは管理されている。

しかし、s-nail は apt インストールしても mailx にはならない。(公式パッケージのバグじゃないの)。仕方ないので手作業で登録する。

参考資料に従って、alternatives を構成する。

s-nail をmailxに追加

sudo update-alternatives \
  --install /usr/bin/mailx mailx  /usr/bin/s-nail 10 \
  --slave  /usr/bin/mail mail /usr/bin/s-nail \
  --slave  /usr/share/man/man1/mail.1.gz mail.1.gz /usr/share/man/man1/s-nail.1.gz \
  --slave  /usr/share/man/man1/mailx.1.gz  mailx.1.gz /usr/share/man/man1/s-nail.1.gz \

s-nail をmailxに設定

設定

sudo update-alternatives --set mailx  /usr/bin/s-nail

不要になったとき削除する場合はこれ

sudo update-alternatives --remove mailx /usr/bin/s-nail

mailxとしてsnail を使う。

s-nail を mailxとして登録したのであとは同じ。

echo Hi | mailx takuya

正しく追加するのは・・・・大変ですね。

その他の方法

curlでSMTPが何処でも使えるので便利だと思う。

mail.utils はmailxと互換性がありそうでないので、しらべなかった。

2022-01-10 追加

mailxで検索にマッチしないので記述見直し。

参考資料

exim4 でsmart relay ホスト利用中にユーザーへのローカル配送メールを外部メールアドレスへ

Exim4 でユーザ宛のメールを外部サーバへ

root 宛のメールを、指定のメールアドレスへ送信する

仕組み

ローカル配送をしないので、ローカル配送宛のメールを指定のメールアドレスへ送信する。

root@mail --> sendmail --> exim4 --> smartrelay --> gmail 

設定

スマートリレーを設定する。

sudo dpkg-reconfigure exim4-config

このとき、mailname(ホスト名)の解決が行われるので注意する。

設定 mail alias を設定する。

/etc/aliases

# /etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: takuya
takuya: takuya+exim4@example.com

ローカル配送のroot 宛は、takuya 宛とする。 takuya 宛は、メールアドレスへ送信する

設定の確認

送信テスト

echo Hi success? | mailx -v takuya

mailx コマンドは snail に指定してあるので、ログが出てきて便利。

送信ログ

mailxからexim4 経由でメールをちゃんと送って、ログを見ながら接続を確認すれば確実

f:id:takuya_1st:20220110044334p:plain

参考資料

https://mirahouse.jp/n10/blog/2015/debian-exim4/

ディスク(hdd/ssd)のブロックデバイスのUUIDを知る

いつも忘れるので再度纏め直し。

UUID は他とかぶることのないユニークIDである。

指定したブロックデバイスのUUIDを知る。

blkid =ブロックデバイスのID

sudo blkid /dev/sda

すべてのUUIDを表示する

sudo blkid

lsblk で一緒に表示する

lsblk -f 

/dev ファイルシステムから知る。

ls -l  /dev/disk/by-uuid/

UUIDでマウントする

mount UUID=XXXXX-XXXXX /mnt

fstab に書く

UUID="XXXX-XXXX" /mnt      auto  noatime,nodiratime,nofail,nosuid,nodev,nofail,x-gvfs-show    0 1

ファイルシステムをチェックする

sudo fsck UUID=xxxx-xxxxx

UUIDだけを得る

blkid -o value -s UUID /dev/sda1

UUIDを変数に入れる

UUID=$(blkid -o value -s UUID /dev/sda1  )

フォーマット時にuuid を指定する。

自動生成するとUUIDが毎回変わってしまう、特に問題がなければ固定してしまってもいいだろう。

mkfs.ext4 -U $uuid /dev/sda1 

FAT32のUUIDは短い

ファイルシステムによってUUIDに複雑性が違いがある。とくにfatは短いので時々ビビる。

takuya@:~$ lsblk -f /dev/nvme0n1p2
NAME      FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
nvme0n1p2 vfat   FAT16       56CD-08C9
takuya@host:~$ sudo fsck UUID=56CD-08C9
fsck from util-linux 2.36.1
fsck.fat 4.2 (2021-01-31)
/dev/nvme0n1p2: 8 files, 870/51145 clusters

UUIDは普段使わないので忘れる

UUIDはfstabに一旦設定しまうと、1年近く使うことがないので、ついつい忘れがち。HDD/SSDが直接UUIDを持つわけではなく、ファイルシステムがUUIDを持つ。

過去記事

dm-crypt のリモートアンロック(SSHでLUKSアンロック)

dm-crypt したシステムルートをリモートSSHから解除

luks の鍵をtpmに入れたいけど、TPMバイスがないPCの場合、鍵をUSBで差し込むか、SSHでリモートからアンロックをするといい

仕組み

luks のルートパーティションがinitramfs に読み出されるときに、dorpbearでsshサーバーで、パスフレーズ入力を待ち受ける。

準備

参考サイト1,参考サイト2,参考サイト3に従って処理。

## debian 11
apt install -y dropbear busybox
## debian 10
apt install dropbear-initramfstools

起動時のIP割当

起動時に initramfs が起動する。initramfs がIPアドレス持つように grub を変更する

dhcp で割り当てる場合

GRUB_CMDLINE_LINUX="ip=:::::eth0:dhcp"

固定IPの場合(おすすめ)

GRUB_CMDLINE_LINUX="ip=10.1.1.5::10.1.1.1:255.255.255.0:my-name:eth0:none"

並びは、次のようになってる(DNSのところは自信がない。)

GRUB_CMDLINE_LINUX="ip=ADDR:BRD:GW:NETMASK:hostname:eth0:none"

eth0 を使わせる設定 を利用して固定することにした。

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

出来上がった設定はだいぶ長い・・・

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 ip=10.1.1.5::10.1.1.1:255.255.255.0:my-server:eth0:none"

eth0 を使わない場合は、enoXXや enpXX を使う

GRUB_CMDLINE_LINUX="ip=10.1.1.5::10.1.1.1:255.255.255.0:10.1.1.53:enp0ns11:none"

公開鍵の追加

initramfsのdropbearへSSHするには公開鍵ログインが必須です。

パスフレーズだと、/bootなどを総当りされる恐れがあります。

公開鍵を登録する

公開鍵の設置先。

/etc/dropbear-initramfs/authorized_keys

既存の公開鍵を設置すればおっけ。

sudo cp /root/.ssh/authorized_keys /etc/dropbear-initramfs/authorized_keys

drobear設定は、/etc/dropbear にもあるが、ここは使わない。 /etc/dropbear-initramfs/に、authorized_keys を置くのが正しい。

update-initramfs -u
update-grub

update-initramfs で firmware 関連のエラーが出るとき

ただし、non-free なfirmware を入れると起動時にめっちゃエラー出る。

W: Possible missing firmware /lib/firmware/i915/skl_huc_2.0.0.bin for module i915
W: Possible missing firmware /lib/firmware/i915/skl_guc_33.0.0.bin for module i915

main contrib nonfree に変えるファームウェアのエラーは消せる。

sudo sed -i  's/ main$/ main contrib non-free/' /etc/apt/sources.list
sudo apt update
sudo apt list firmware*
sudo apt install firmware-linux

シリアルも有効にしておく。

grub に設定を書いて、シリアルのコンソールでも待ち受けておく。(予備手段)

GRUB_CMDLINE_LINUX='console=tty1 console=ttyS0,115200'
GRUB_TERMINAL='console serial'
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

リモートで作業することも考えて、シリアルを有効にしておく。

リモート時に障害時対応ができると思う。

シリアルの接続先に、Raspiなどをつないでおく。そうすれば、RaspiにSSHしてログインし、serial console でメンテできます。 raspi zero とかのRS232CのGPIOとか使えばコストも安く上がる。

ホスト鍵を揃えてやる/fingerprint不一致対策

grub で指定するIPアドレスを同じにすると、initramfs(dropbear)と 起動後のdebian(opensshd) でホスト鍵が異なって警告が鬱陶しい。そこでホスト鍵を揃えておく

ホスト鍵の揃え方に従って処理をする。

変換対象の鍵

root@borane:/home/takuya# ls -l  /etc/ssh/ssh_host_* | grep -v pub
-rw------- 1 root root  505 1114 16:51 /etc/ssh/ssh_host_ecdsa_key
-rw------- 1 root root  399 1114 16:51 /etc/ssh/ssh_host_ed25519_key
-rw------- 1 root root 2590 1114 16:51 /etc/ssh/ssh_host_rsa_key

ssh_host_ecdsa_key を変換する。

## 作業ファイルにコピー
cp /etc/ssh/ssh_host_ecdsa_key /tmp
## PEM 形式に変換
ssh-keygen -p -m PEM -f /tmp/ssh_host_ecdsa_key
## dropbear用に変換
sudo dropbearconvert openssh dropbear \
 /tmp/ssh_host_ecdsa_key \
 /etc/dropbear-initramfs/dropbear_ecdsa_host_key

これを繰り返す

for name in ecdsa ed25519 rsa;  do 
    cp /etc/ssh/ssh_host_$name_key /tmp;
    ssh-keygen -p -m PEM -f /tmp/ssh_host_$name_key
    dropbearconvert openssh dropbear/tmp/ssh_host_$name_key /etc/dropbear-initramfs/dropbear_$name_key
done;

initramfs の再生成 / grub 再生性

sudo update-initramfs -c -t -k all
## または
# sudo update-initramfs -u
sudo update-grub

これでおっけ。

起動CHECK

起動したらSSHでログインする。

ssh -vvv -i ~/.ssh/id_rsa root@192.168.2.5

参考資料

dm-crypt でマッピングされてるブロックデバイスの名前の変更

dm-crypt で luks のデバイス名を変更

バイス名を変更したい。

cryptsetup luksでopen されてるデバイス名のデフォルト設定を変えたい。

dm-crypt でマッピングされてるブロックデバイスの名前の変更ができればいいなと。 調べたら変更できるとわかった。

暗号化デバイスの名前の変更

 sudo dmsetup rename nvme0n1p4-dm dm_crypt-0

dmsetup コマンドを使えば、できるとわかった。

やってみた。

takuya@server:~$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1         259:0    0 476.9G  0 disk
└─nvme0n1p4     259:4    0 476.5G  0 part
  └─nvme0n1p4-dm          254:1    0 476.5G  0 crypt
    ├─server-root 254:2    0  93.1G  0 lvm   /
    ├─server-home 254:3    0  55.9G  0 lvm   /home
    └─server-swap 254:4    0   9.3G  0 lvm   [SWAP]

takuya@server:~$ sudo dmsetup rename dm dm_crypt-0
takuya@server:~$ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1         259:0    0 476.9G  0 disk
└─nvme0n1p4     259:4    0 476.5G  0 part
  └─dm_crypt-0  254:1    0 476.5G  0 crypt
    ├─server-root 254:2    0  93.1G  0 lvm   /
    ├─server-home 254:3    0  55.9G  0 lvm   /home
    └─server-swap 254:4    0   9.3G  0 lvm   [SWAP]
takuya@server:~$

なんでこんな事するの?

えっとね、Debian/Ubuntuのインストール時に自動的に決まるdm名に nvme01と入っててものすごく可搬性が悪そうだから。変えておきたかった。

変更後には、update grub/ initramfs

自動でupdate されるが、念の為に、手動で再度実行してもいいかと

update-initramfs -c -t -k all
# または
# update-initramfs -u

grub更新

update-grub

参考

https://unix.stackexchange.com/questions/81011/how-to-change-the-name-an-encrypted-full-system-partition-is-mapped-to

システムが uEFIで起動しているか見る

EFIで起動しているかチェックする

EFI起動して無いと、update-initramfsupdate-grubEFIが使えない、使われないので、ブートを修正するとき、最初にEFIで鬼道しているか、ちゃんと確認する。

マウント見てみ良いんじゃない?

takuya@:~$ mount | grep efi
efivarfs on /sys/firmware/efi/efivars type efivarfs (rw,nosuid,nodev,noexec,relatime)
/dev/nvme0n1p2 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro)

efibootmgr が動くかどうか

takuya@:~$ efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0004,0006,0005,0000,0001
Boot0000* Windows Boot Manager
Boot0001* ubuntu
Boot0002* debian
Boot0004* ハードドライブ
Boot0005  debian
Boot0006* リムーバブルドライブ

参考資料

bashで入力しやすく見やすいパスワードをサクッと作る(シェルコマンドでハイフン区切りのパスワード生成)

シェルコマンドだけで、覚えやすいパスワードを作りたい

iOS のパスワードジェネレーションみたいな、ハイフン区切りのパスワードをサクッと作りたい。

pwgen を入れるとはやい。

sudo apt install pwgen 

pwgenのパスワードをハイフン区切りにする

takuya@$ pwgen  5 4  | xargs echo  | sed 's/ /-/g'
euD1i-Aloh3-uN9ai-nahZ7

曖昧な文字を排除する。

pwgen -s -B -n 5 5 |xargs echo | sed 's/ /-/g'
Mv3tW-m9Pnc-iMr3u-pyJ3C-7TciV

openssl を使う。

pwgen がないときは openssl で

for i in {1..4}; do openssl rand -hex 4; done  | xargs echo  | sed 's/ /-/g'

openssl hex の場合文字種がA-Fに限定される。

openssl でbase64 を使う

openssl でランダム文字列な文字列を作る。

for i in {1..4}; do openssl rand -base64 6; done  | xargs echo  | sed 's/ /-/g'

BASE64の場合読みにくい文字種と+記号が混じるのでちょっと使いにくい。

個人的には、base58 くらいが使いやすいと思うけど。

base58を使う場合

base58は曖昧な文字を省いてくれるし記号もないので。人間が見て判別するパスワード向きです。

sudo apt install base58

コレを組み合わせる。

for i in {1..4}; do echo $(openssl rand 4 | base58) ; done  | xargs echo  | sed 's/ /-/g'

2022-01-08

追記更新

dockerのコンテナにホストssh経由で接続する

リモートのdocker のコンテナへSSHで接続する

作業マシンは、macOS/Windowsで、docker はリモートのUbuntu Serverの中。なんてことが多いと思います。

次のような接続。

PC ---<internet>---UbuntuServer--<dockerio>---container

直接 container に入りたくないですか?

ssh でやると2回の処理に別れます。

$ ssh ubuntu-server
takuya@ubuntu # docker -it exec myContainer bash 

一回で済ませたくないですか?

ssh myContainer

ssh -t でできます。

それTTYをアロケーションすればできます。

ssh -t ubuntu-server 'docker exec -it myContainer bash '

設定で更に省略

Host myContainer
  Hostname ubuntu-server
  RequestTTY force
  RemoteCommand docker exec -it e339fc9cfb25 bash

すっきり!

ssh myContainer

たまに、docker コンテナに openssh入れようとしてる人いる。 けど、殆どの場合必要ないからね。無駄な努力とCPU浪費してQiitaにエントリ書いて、DockerfileビルドしてSSD寿命縮めて、何してんだろうなぁ。もっとエコに生きようぜ。怠惰はプログラマの美徳だよ。

参考

追記

sshしなくてもdocker_host環境設定すれば、直接TCP経由でリモートのdockerに接続もできます。こっちの方がむしろ便利じゃないかな。 docker別ホストから接続、管理SockをTCP経由許可して利用する。 - それマグで!

sshで踏み台(ゲートウェイ)経由での接続のショートカットを作る

SSHのconfig で踏み台ショートカットをつくる

  • ssh を経由して sshする
  • ssh 経由して docker exec する
  • ssh経由して lxc shell する
  • ssh 経由して virsh consoleする

リモートの仮想マシンやdocker や lxc までなんでも簡単に ssh できちゃいます。

SSHの踏み台経由でsshする

SSHで、ゲートウェイSSHログインしてから、内部のPCにログインする。

書き方

ssh -t 踏み台サーバー " ssh アクセス先サーバー"

ssh -t gw.example.com "ssh 192.168.2.100 "

ssh -t-tssh -o 'RequestTty force' の省略形で、tty の割当を矯正するものです。

ssh 設定にする

毎回記入するのが面倒で、ssh_config の設定にする場合はこうする。

host 好きな名前
  Hostname 踏み台の先のIP
  ProxyCommand ssh 踏み台のIP -W %h:%p

設定例

先程の接続例

ssh -t gw.example.com "ssh 192.168.2.100 "

先程の接続例をconfig にする例

host s1-gitlab
  Hostname 192.168.2.100
  ProxyCommand ssh gw.example.com -W %h:%p

上記 config を使う例

ssh s1-gitlab

踏み台のホスト名を「別名にする」

踏み台のIPやホスト名を書いていると、変更に弱くなる。踏み台の「名前」も設定にする。

ssh -t humidai "ssh 192.168.2.100 "

上記の設定例。

host humidai
  Hostname gw.example.com
host s1-gitlab
  Hostname 192.168.2.100
  ProxyCommand ssh fumidai -W %h:%p

これを応用すると、「踏み台」を「踏み台」にして多段で入れる。

踏み台経由でdocker

踏み台でdocker のコンテナに直接に入れます。

ssh 192.168.2.240  -t 'docker exec -it e339fc9cfb25 bash'
## または
ssh 192.168.2.240  -o 'RequestTTY true' 'docker exec -it e339fc9cfb25 bash'

上記コマンドのssh_config 設定例。

Host sample
  Hostname 192.168.2.240
  RequestTTY force
  RemoteCommand docker exec -it e339fc9cfb25 bash

踏み台経由でのLXC

LXCも同様にして、コンテナに直接入れます。

ssh lxc-host -t' lxc shell lxc-container-01'
## または
ssh lxc-host -o 'RequestTty force' ' lxc shell lxc-container-01'

上記コマンドのconfig例

  Host lxc-container01
    Hostname lxc-host
    RequestTTY force
    RemoteCommand lxc shell lxc-container-01 

踏み台経由の virt-machine

virsh でkvm+qemu仮想マシン へ接続するのもこれでいける。

ssh 192.168.2.240 -t 'sudo virsh console 28'

virsh の場合は、sudo つけないと動かないかも。

おまけ windows標準のopenssh-server でwslを直接呼び出す。

Windowsの標準搭載のopenssh-sever だと cmd.exeになってしまうので、wsl や ps を直接呼び出す。

ssh win10pro -t 'wsl'
ssh win10pro -t 'powershell'

結構なんでもできるよ。

関連資料

WSLで音楽をWindowsから再生する。

WSLで音楽をWindowsから再生する。

WSL2にX windowがあるからいいじゃないかとか、WSLv2 with X でやればいいじゃないかとかそういうのは一旦脇に避けておいて、mplayer を使って音楽を再生したい。

pulseaudio を使う。

TCPを通すとできる。

仕組み

  1. Windows側が tcp 127.0.01 を pulseaudio で listenする。
  2. WSL 側が tcp 127.0.0.1 に 接続しサウンドを送る

ようは、2ステップです。

準備1(Windows+pulseaudio+tcp)

windowsでpluseaudioを動かして、tcp でリッスンする。

pulseaudio の配置場所を作る

appdata=/mnt/c/Users/takuya/AppData/Roaming
cd $appdata
mkdir PulseAudio
cd PulseAudio

pulse audio を用意

curl -LJO http://bosmans.ch/pulseaudio/pulseaudio-1.1.zip
unzip -o -d . pulseaudio-1.1.zip

TCPでリッスンする設定を追加

conf='load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1'
echo $conf >> etc/pulse/default.pa

pulseaudio を起動

C:/Users/takuya/AppData/Roaming/PulseAudio/bin/pulseaudio.exe

起動用スクリプトにする。

var ws = WScript.Createobject("WScript.Shell")
ws.Run('C:/Users/takuya/AppData/Roaming/PulseAudio/bin/pulseaudio.exe --exit-idle-time=-1',0)

wscript で起動する。

wscript.exe pulse-start.js

起動すると、タスクマネージャーに出てくる。

wsl 側でpulseaudioを設定する。

pulse audio をインストールして、TCPで接続するように設定する。

インストール

sudo apt install pulseaudio 

設定を変える。

echo default-server = tcp:localhost >> /etc/pulse/client.conf

再生してみる

sudo apt install mplayer
mplayer sample.m4a

2023-09-25 追記 mplayer で pulse を明示するようがあった。

mplayer  -vo x11 -ao pulse sample.m4a
mplayer -vo null-ao pulse sample.m4a

mplayer で再生時にオーディオ・ビデオをどこに出すかのは、次を見れば良い。

mplayer -vo help
mplayer -ao help

またwindowsのpulse audio はアイドルさせるとプロセスがすぐ終了するので、直前に再起動する必要がある。

再生できた

WSL でもmplayer を使って再生できた。

まさか、いまさらWScriptを持ち出すとは思わなかった。

今回は、WSLv1なので、V2の場合はどうなることやら。

しかし、アウトプットのスピーカーを選べないのがなぁ。pulse audioのWindowsののGUIとか設定方法を探るしか無いな。

参考資料

samba のインストールと初期設定と接続テスト

今回やること、Sambaをインストールして初期設定。HOMEフォルダの共有macOSのタイムマシン作る。

samba のインストール

apt install avahi-daemon samba samba-vfs-modules

samba-vfs-modulesは入れてないと、VFS 関連のオプションが使えない、後で困る。最初に入れておく。

Sambaユーザーの有効化

Sambaをインストールするとスタンドアロンサーバーで起動される。

スタンドアロンの場合、ユーザを作る必要がある。

一般的に、Windowsユーザとパスワードと同じものを設定する。

## 有効化
smbpasswd -e takuya
## 無効化
smbpasswd -d takuya
## ユーザー作成
smbpasswd -a takuya

サンプル

## 作る前
root@raspi-ubuntu:~# smbpasswd -e takuya
Failed to find user takuya in passdb backend.
## 作成
root@raspi-ubuntu:~# smbpasswd -a takuya
New SMB password:
Retype new SMB password:
Added user takuya.

デフォルトのスタンドアロンモードでは、Sambaの接続可能ユーザーがtdb に保存されており、 tdb のファイルにユーザーを登録する必要がある。

登録後は、パスワードはUNIXのパスワードコマンドと同期させられるのだが、、sudo passwd takuya などで変えたら同期されないし、いつでも同期されているとは限らない。なので明示的に 同期しないと思うことにしてる。

スタンドアロンサーバーとはWindows10/7のネットワーク・ファイル共有を実現するようなもの。

ホームフォルダを共有する。

Sambaをインストールしたサーバーのユーザのホームフォルダを共有する。

[homes]
    browseable = No
    comment = Home Directories
    create mask = 0700
    directory mask = 0700
    valid users = %S

任意のフォルダを共有する。

[MyShare]
    comment = ゲストも使える。
    guest ok = Yes
    path = /opt/samba-share/
    read only = No

ゲストユーザーをユーザーID

何も指定しなればば、anonymous(匿名)ユーザーになる、そのユーザーが作ったファイルは nobody:nogroup になる。

簡易的なゴミ箱

次の記述を足すと、サーバー側のゴミ箱が有効になる。

[MyShare]
    ## 略
    recycle:repository = .recycle
    recycle:keeptree = yes
    recycle:versions = yes

削除したファイルは .recycle に残される。

簡易的なゴミ箱なので、利用者(クライアント)側からは見えない。

Windowsのボリューム・シャドウコピーなどは、専用の設定を書く必要ががる。

接続テスト

macOS

## ユーザー指定
smbutil view //takuya@192.168.1.140
## Gesut
smbutil view //192.168.1.140

Linux

## ユーザー指定
smbclient -L 192.168.1.100 -U takuya
## 指定省略すると現在のユーザー
smbclient -L 192.168.1.100 -

linux でのゲスト接続

## パスワードを省略するとゲスト(anonymous)
takuya@raspi-ubuntu:~$ smbclient  -L 192.168.1.100 -h
Enter WORKGROUP\takuya's password:
Anonymous login successful

windows

今どきのWindowsはどうやるんだろう。昔からある net コマンドだとこうする。

接続

net use \\192.168.1.100 /user:takuya PASSWORD

切断

net use /delete * 

サーバー側で現在の接続状態を見る

サーバーに誰がつないできてるのかを見ておく。

smbstatus -b
smbstatus -d

mac 用 VSFをオンにすると、タイムマシンで使える。

[global]
    ## 略
    fruit:encoding = native
    fruit:metadata = netatalk
    idmap config * : backend = tdb
    vfs objects = catia fruit streams_xattr
[TimeMachine]
    comment = Backup for Mac Computers
    guest ok = Yes
    path = /opt/samba/
    read only = No
    fruit:time machine max size = 1T
    fruit:time machine = yes

f:id:takuya_1st:20211110012215p:plain

タイムマシンで見えないとき、Samba-VFSを確認する。

わたしは、VFSエラーになっていた。

VFSがないときは、次のように vfs が cannot open shared object になっている。

[2021/11/09 16:19:55.858644,  0] ../../lib/util/modules.c:49(load_module)
  Error loading module '/usr/lib/aarch64-linux-gnu/samba/vfs/streams_xattr.so': /usr/lib/aarch64-linux-gnu/samba/vfs/streams_xattr.so: cannot open shared object file: No such file or directory

Ubuntu/Debianは別パッケージになっているが、 個人的に、VFSなしでSambaを使うとか考えられないので、VFSを入れておく。

apt install samba-vfs-modules 

TimeMachineやmacOSとの接続は次が詳しかった→https://wiki.samba.org/index.php/Configure_Samba_to_Work_Better_with_Mac_OS_X

設定の確認

設定が有効かどうか、確認するコマンド

testparm -s  /etc/samba/smb.conf

Debian/Ubuntuは設定例がたくさんあって、どこが有効か探すのが手間なので、testparm を使って有効な設定だけを表示すると設定がやりやすい。

takuya@raspi-ubuntu:~$ testparm -s  /etc/samba/smb.conf
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

# Global parameters
[global]
    log file = /var/log/samba/log.%m
    logging = file
    map to guest = Bad User
    max log size = 1000
    obey pam restrictions = Yes
    pam password change = Yes
    panic action = /usr/share/samba/panic-action %d
    passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
    passwd program = /usr/bin/passwd %u
    server role = standalone server
    server string = %h server (Samba, Ubuntu)
    unix password sync = Yes
    fruit:encoding = native
    fruit:metadata = netatalk
    idmap config * : backend = tdb
    vfs objects = catia fruit streams_xattr


[homes]
    browseable = No
    comment = Home Directories
    create mask = 0700
    directory mask = 0700
    valid users = %S


[TimeMachine]
    comment = Backup for Mac Computers
    guest ok = Yes
    path = /opt/samba/
    read only = No
    fruit:time machine max size = 1T
    fruit:time machine = yes

samba をマウントする

mount -t cifs -o username=USERNAME,password=PASS //192.168.1.1/share /mnt/to/path

rclone で マウントして Samba で共有する。

rclone は samba をサポートしてないっぽいので、samba とミラーリングするとしたら、

rclone でマウントしたフォルダをSambaで共有するか、

Sambaマウントしたフォルダを、rclone でローカルとして使うか

rclone でマウントしたフォルダをSambaに使わせるとき、

vfs cache と、パーミッションと、ユーザーマッピングが必要になる。

--allow-other --uid=1001 --vfs-cache-mode=full

サンプル

sudo rclone --config /home/takuya/.config/rclone/rclone.conf --allow-other --uid=1001 --vfs-cache-mode=full mount  gdrive:/server/samba-mount /opt/samba

感想

クラウドが使えるし、NASとかで手軽にSambaが使えるせいか、自宅鯖でSambaとかあまり流行らないですよねぇ。そのせいか、ネット上にSambaの情報がなくて困ります。

Sambaを使って、WindowsのADサーバーにして移動プロファイルやネットワークドライブのマウントとか、一般のご家庭らしくドメインログオンやりたいのですが。ドメインログイン自体もう古いんでしょうか。仮想マシンで大量にホスト作ってたらLDAPしたくならないんですかね。Dockerでrootでうごかすから気にならないんですかネェ。

私は、macOSのタイムマシンで使うので、どうしてもSambaを設定する必要があった。いままではAFPとnetatalk で使ってたのだが、ついにOS X から macOSに移行することになって、ついにafp よりSmbになってしまった。

ネットワークのファイル共有とかホント便利だと思うし、家庭用機器の家電はクラウド対応とかじゃなくて単純にSMBに対応すれば相当改善すると思うんですがねぇ。

その他の情報

過去記事

udhcpc でDHCPの割当とルーティングを入れる。

udhcp というDHCPクライアント

udhcp はDHCPプロトコルに基づいて、クライアントリクエストをブロードキャストする。DHCPサーバーを結果を受け取る。

その結果はシェル変数に入った状態で、スクリプトに渡される。

udhcp -i eth0 -s /path/to/script.sh

スクリプト内部でIPアドレスの割当やルーティングを行う。 そのスクリプトは、標準的なものが、/usr/share/udhcpc/default.script で用意されている。

殆どの場合、標準のdefault.script で十分である。ただ、このスクリプトはデフォルトGWやルーティングを書き換えてしまうので注意する。 特に、busybox が搭載されたLinuxルーターの場合、このGWの書き換えが重要になる。VPNなどを利用するときは自分で用意する必要がある。

udhcp を試してみる。

スクリプトを指定して使うudhcp だから、何もしないでecho するスクリプトを用意する。

DHCP 取得値は、変数に入るので変数をECHO する。

呼び出しは、複数回行われる。取得時、リリース時、更新時である。

呼び出しスクリプトを作る

root@OpenWrt:~# vim /root/sample.sh
root@OpenWrt:~# chmod +x /root/sample.sh
/root/sample.sh
#!/usr/bin/env bash
echo "####script start ####"
echo $@
echo -----------
for i in ip mask subnet serverid interface router opt53 ; do
  echo $i=${!i}
done
echo "####script end ####"

udhcp を呼び出す。

root@OpenWrt:~# udhcpc -i vpn_soeth0 -s /root/sample.sh
udhcpc: started, v1.30.1
####script start ####
deconfig
-----------
####script end ####
udhcpc: sending discover
udhcpc: sending select for 10.35.225.152
udhcpc: lease of 10.35.225.152 obtained, lease time 43200
####script start ####
bound
-----------
lease=43200
mask=24
ip=10.35.225.152
router=10.35.225.254
domain=Z3543
dns=10.255.235.20 160.193.8.6
serverid=10.255.235.7
subnet=255.255.255.0
opt53=05
interface=vpn_soeth0
####script end ####
root@OpenWrt:~#

udhcp から引数付きで呼ばれる。

udhcp から、イベントごとに次のように引数付きで呼び出されることがわかる。

## 初期化
/root/sample.sh deconfig
## 割当取得時
/root/sample.sh bound
## 割当取得時
/root/sample.sh renew

スクリプトを指定する理由

なぜ、スクリプトを指定するのか。省略可ではないか。

省略可だけど、問題がある。とくにVPN

スクリプト指定を省略すれば、通常のDHCPになる。

インターフェースだけ指定をすれば、通常DHCPとして動く。

udhcpc -i eth0 

このとき実行されるのは次のファイル

/usr/share/udhcpc/default.script

ただし、これは、デフォルトGWをガッツリ書き換える。

VPN 時に面倒くさい。

udhcpc を使うと、DHCP時に defaultが切り替えが起き、ネットワークが切断される

また、中途半端に書き換えるので、設定次第では、default 経路が代わりVPN経路がなくなり通信ができなくなる。

また、切断時のもとのデフォルトGWに戻せな無い。

これらの、VPN Routing を明示的に行うために、スクリプトを使う。

スクリプトの書き方は /usr/share/udhcpc/default.script を参考に、ルーティング・NAT転送・ポート閉塞・ポート解放などを書く。

udhcpc を使いLANとルータに接続する以外で使う、とくにVPNの場合スクリプトが必須である。

参考資料