alfort's Blog

Linuxエンジニアのメモ

WSLからVBS(Visual Basic Script)を実行する方法のメモ

WSL から VBS(Visual Basic Script)を実行する

WSL から VBS(Visual Basic Script)を実行する方法を知りたくなったのでそのメモ。

そもそもWindowsで完結するのになぜWSLがいるのか?

そもそも、VBSは定期的に実行したい処理はVBSでしか提供されていない。 このためWindows上で完結させてしまうのが一番いいのだが、Windows自体に明るくなく、 どうすればバッチ処理を行えるのか、定期的に実行する方法は…などなど、調べることがたくさんある。

一方でLinuxについてはSystemdやCronのような仕組みを使って定期的に実行する方法がわかっているし、 最近のWSLではSystemdが動作するようになっているし、WSLからWindows上のCドライブをマウントすれば、 Windows向けのプログラムを実行することもできる。 ということで、Windowsでのバッチ処理だの定期的な処理だのを学ぶコストをできるだけ抑えるには VBSスクリプトをWSLから実行したほうが手っ取り早いのでこんなことをやろうとした。

VBSファイルを実行するためのプログラム

VBSファイル自体は単純なテキストファイルで、エディターを使って簡単に書き換えることができる。 Pythonシェルスクリプトのように、スクリプトファイルを実行するためのインタープリタがあるはずである。 ということで、ググってみると、VBSファイルを実行するためのプログラムは、cscript.exeらしい。 また、私が使っているWindows11というか64bit版のWindowsでは、cscript.exeC:\Windows\SysWOW64配下にある。

WSLからWindowsファイルシステムにアクセスする

WSLからWindows上のファイルシステムにアクセスするためには、/etc/fstabmountコマンドを使って、 Windows上のファイルシステムをマウントする必要がある。 以下のような内容で、/etc/fstabにエントリを追加、mountコマンドによる自動マウントを行うことで、 Windows上のCドライブをマウントすることができる。

C: /mnt/c drvfs rw,noatime,uid=1000,gid=1000,case=off,umask=22 0 0

また、WSL上からは/mnt/cというパス配下に色々ディレクトリが見えるようになっていて、 ここがCドライブのルートディレクトリになる。

WSLからVBSを実行する

あとは簡単で、WSL上のシェルから以下のようなコマンドを実行するだけでVBSファイルを実行することができる。 実行したいスクリプトWindows上のデスクトップに置いてある、hello.vbsというファイルとする。

$ /mnt/c/Windows/SysWOW64/cscript.exe /mnt/c/Users/username/Desktop/hello.vbs

これで、WSLからVBSファイルを実行することができる。

Windowsの音声出力先をアイコンクリックで変える

以下のような記事を参考に、Windowsの音声出力先を変えようとしたものの、うまくいかなかったのであれこれ調べたメモ。

itib.hatenablog.com

上記のブログでは、以下のようなショートカットを作成すれば音声出力先が切り替えられるとのことだけどうまくいかなかった。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\Users\guest\deviceSet.ps1 "{4c884bad-d966-441a-b1f9-4ec0fced2fbc}"

実際には -Fileオプションの指定と、deviceSet.ps1へのパスをダブルクォーテーションで囲む必要があるらしい。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "C:\Users\guest\deviceSet.ps1" "{4c884bad-d966-441a-b1f9-4ec0fced2fbc}"

起動時に一般ユーザー権限のサービスを起動する

systemd --userを使うことでroot権限が必要ないサービスやタイマーを非root権限のユーザーがroot権限なしに設定することができる。

ただし、システムのサービスと異なり起動時にサービスは起動してくれない。 ユーザーのセッションが存在するとき(私の場合はsshサーバーとして利用しているので、自分がサーバーにログインしているとき)にしか動作してくれない。

サーバーの起動時にsshでログインするより前に作図したいことだってあるだろうし、タイマー関連の操作はログインしているかどうかにかかわらず指定した時刻に動作してほしい。

今回はそういった場合にどうすればいいのかを調べてまとめた話。

こういったときには、loginctlを使って設定を行っておくとユーザーセッションのありなしにかかわらずサーバーが起動したときにユーザーが設定したサービスを立ち上げることができる。

まずは以下のように、Lingerの項目がnoになっていることを確認する。

$ loginctl user-status
XXXXXX (1000)
           Since: Mon 2023-04-17 09:49:57 JST; 1h 44min ago
           State: active
        Sessions: 6 5 *1
          Linger: no   <---
            Unit: user-1000.slice
...

次に、以下のコマンドでユーザーセッションのありなしに関わらずサービスを立ち上げるよう指示する。

$ loginctl enable-linger

最後にもう一度、Lingerの箇所がyesになっていることを確認する。

$ loginctl user-status | head
XXXXXX (1000)
           Since: Mon 2023-04-17 09:49:57 JST; 1h 43min ago
           State: active
        Sessions: 6 5 *1
          Linger: yes    <---
            Unit: user-1000.slice
...

これで再起動などをかけた後に、サービスがきちんと起動しているはず。

UbuntuのファイアーウォールUFWの簡単な使い方メモ

Ubuntuのパッケージマネージャーから入れられるファイアーウォールはfirewalldの他にも、ufw(Uncomplicated FireWall)というソフトウェアがあるらしい。

名前からして単純らしいのでその使い方を調べた時のメモ。

ufwのインストール

$ sudo apt install ufw

状態の確認 (ufw status)

ufwが有効になっているのかどうか、また空けているポートの確認が可能。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
3000                       ALLOW       Anywhere
22/tcp                     ALLOW       Anywhere
3000 (v6)                  ALLOW       Anywhere (v6)
22/tcp (v6)                ALLOW       Anywhere (v6)

無効な場合には、以下のようにinactiveと表示される。 また、設定によって開けているポートも表示されることはない。

$ sudo ufw status
Status: inactive

ファイアーウォールの無効化 (ufw disable)

$ sudo ufw disable
Firewall stopped and disabled on system startup

ファイアーウォールの有効化 (ufw enable)

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ポートの追加

通信を許可するポートを追加 (ufw allow)

3001/tcpを許可するように設定する。

nariba@ubuntu2204lts:~$ sudo ufw allow 3001/tcp
Rule added
Rule added (v6)

通信を拒否するポートの追加 (ufw deny)

3001/tcpを拒否するように設定する。

なお、似たようなオプションとしてrejectもあるが、セキュリティ的にはdenyのほうが好ましい。

$ sudo ufw deny 3001/tcp
Rule updated
Rule updated (v6)

設定の削除 (ufw delete)

ufw status numberedで設定の番号を確認し、その番号をufw delete NUMで削除する。

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 3000                       ALLOW IN    Anywhere
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 3001/tcp                   DENY IN     Anywhere  <--- これを削除したい
[ 4] 3000 (v6)                  ALLOW IN    Anywhere (v6)
[ 5] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 3001/tcp (v6)              DENY IN     Anywhere (v6) <--- これを削除したい

$ sudo ufw delete 3
Deleting:
 deny 3001/tcp
Proceed with operation (y|n)? y
Rule deleted

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 3000                       ALLOW IN    Anywhere
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 3000 (v6)                  ALLOW IN    Anywhere (v6)
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 5] 3001/tcp (v6)              DENY IN     Anywhere (v6)

$ sudo ufw delete 5
Deleting:
 deny 3001/tcp
Proceed with operation (y|n)? y
Rule deleted (v6)

通信を拒否する場合には、denyrejectどちらが好ましいのか?

ufwを使ってあるポートにdeny, rejectそれぞれの設定をかけた場合、ポートスキャナであるnmapコマンドを使うとどう見えるのかを調べる。

以下のようにrejectを設定した場合ほかのユーザーから設定が見えてしまうので、rejectよりもdenyを設定したほうがよさそう。

rejectを設定した場合

ufwの設定とその確認

$ sudo ufw reject 3001/tcp
Rule added
Rule added (v6)

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 3000                       ALLOW IN    Anywhere
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 3001/tcp                   REJECT IN   Anywhere
[ 4] 3000 (v6)                  ALLOW IN    Anywhere (v6)
[ 5] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 3001/tcp (v6)              REJECT IN   Anywhere (v6)

ポートスキャンの結果

$ sudo nmap -Pn 192.168.XXX.XXX
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-08 15:10 JST
Nmap scan report for XXXXXXX (192.168.XXX.XXX)
Host is up (0.00018s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT     STATE  SERVICE
22/tcp   open   ssh
3000/tcp open   ppp
3001/tcp closed nessus        <----- ポートが見えている
MAC Address: XX:XX:XX:XX:XX:XX (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 4.23 seconds

denyを設定した場合

ufwの設定とその確認

$ sudo ufw deny 3001/tcp
Rule updated
Rule updated (v6)

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 3000                       ALLOW IN    Anywhere
[ 2] 22/tcp                     ALLOW IN    Anywhere
[ 3] 3001/tcp                   DENY IN     Anywhere
[ 4] 3000 (v6)                  ALLOW IN    Anywhere (v6)
[ 5] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 3001/tcp (v6)              DENY IN     Anywhere (v6)

ポートスキャンの結果

$ sudo nmap -Pn 192.168.XXX.XXX
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-08 15:10 JST
Nmap scan report for XXXXXXX (192.168.XXX.XXX)
Host is up (0.00019s latency).
Not shown: 998 filtered tcp ports (no-response)
PORT     STATE SERVICE
22/tcp   open  ssh
3000/tcp open  ppp
MAC Address: XX:XX:XX:XX:XX:XX (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 4.54 seconds

CentOS 8からCentOS 8 Streamへの移行

概要

CentOS 8からCentOS 8 Streamへ移行するにあたって躓いたのでそのメモ。

CentOS 8からCentOS 8 Streamへの移行手順

以下のCentOS StreamのWebサイトによると、CentOS上で次のようなコマンドを打てばよいらしい。

www.centos.org

dnf --disablerepo '*' --enablerepo extras swap centos-linux-repos centos-stream-repos
dnf distro-sync

起きたエラー

手順はCentOS 8のリポジトリを無効にしたうえで、新しいCentOS 8 Streamのリポジトリを有効化するもの。 ただ以下のように、GPG鍵のパッケージが見つからずリポジトリの入れ替えがうまくいかなかった。

$ sudo dnf --disablerepo '*' --enablerepo extras swap centos-linux-repos centos-stream-repos
CentOS-8 - Extras                                                                                                                                          253  B/s | 1.5 kB     00:06
CentOS-8 - Extras                                                                                                                                          7.1 kB/s |  10 kB     00:01
No match for argument: centos-linux-repos
削除対象のパッケージはありません。
エラー:
 問題: conflicting requests
 - nothing provides centos-gpg-keys = 1:8-3.el8 needed by centos-stream-repos-8-3.el8.noarch
(インストール不可のパッケージをスキップするには、'--skip-broken' を追加してみてください または、'--nobest' を追加して、最適候補のパッケージのみを使用しないでください)

対処方法

以下のようにして足りないパッケージをインストールしたところ、移行がうまくできた。

$ sudo dnf --disablerepo=\* update https://vault.centos.org/8.5.2111/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-3.el8.noarch.rpm

参考にしたウェブサイトなど

www.centos.org

forums.centos.org

HHKBを買ったら理想のキーバインドを手に入れた話

HHKBを買ってしまった

これを買ってしまった。 まだ買ったばかりなのでレビューなんてできないけれども、なんでこのキーボードにしようと思ったとか書く。

www.amazon.co.jp

続きを読む