ネットワーク」カテゴリーアーカイブ

WordPressのコンテンツをコマンドラインで別のサーバーへコピー

WordPressのコンテンツをコマンドラインで別のサーバーへコピーするには、主に以下の工程になります。

1. 旧サーバーのWordPressデータベースをエクスポート

  • SSHで旧サーバーにログインし、WordPressインストールディレクトリに移動。
  • MySQLデータベースのバックアップを取得。
  • ysqldump -u ユーザー名 -p データベース名 > ~/backup.sql
  • データベースのSQLファイルを圧縮することも推奨されます。
  • tar -czvf backup_db.tar.gz ~/backup.sql

2. WordPressファイル(テーマ、プラグイン、アップロードなど)を圧縮してバックアップ

  • WordPressのルートディレクトリのすべてのファイルを圧縮。
  • tar -czvf wordpress_files.tar.gz /path/to/wordpress/

3. 圧縮したデータベースファイルとWordPressファイルを新サーバーへ転送

  • scpコマンドで新サーバーに転送。
  • scp wordpress_files.tar.gz user@new-server:/path/to/destination scp backup_db.tar.gz user@new-server:/path/to/destination

4. 新サーバーでファイルを展開し、データベースをインポート

  • 新サーバーにSSHログイン後、ファイルを展開。
  • tar -xzvf wordpress_files.tar.gz -C /path/to/wordpress/ tar -xzvf backup_db.tar.gz
  • MySQLにデータベースをインポート。
  • mysql -u ユーザー名 -p 新データベース名 < backup.sql

5. wp-config.phpの設定やURLの書き換え

  • wp-config.phpでデータベース接続情報を新環境に合わせて編集。
  • 必要に応じてWP-CLIでドメイン名などを置換。
  • wp search-replace '旧ドメイン' '新ドメイン' --all-tables

6. パーミッション設定やキャッシュクリア、プラグインリセットなどを実施し、動作確認

この方法は基本的な手順で、WP-CLI(WordPressコマンドラインツール)を利用するとより便利です。WP-CLIを用いたエクスポート・インポートや置換も可能で、自動化しやすいです。

以上の手順で、WordPressのコンテンツをコマンドラインを使って別サーバーに安全かつ完全に移行できます。

Let’s Encrypt の証明書をブラウザ上で簡単取得

参照サイト

証明書の確認 cat cert.pem |openssl x509 -text -noout

実際に取得するサイト

 Let’s Encrypt へ登録

Emailを入力して、署名鍵を取得

2. チャレンジトークンの取得

3. ドメイン名の所有確認

4. 証明書発行申請

5. 発行された証明書

cert.pem (サーバ証明書)、chain.pem (中間証明書)、fullchain.pem (サーバ証明書 + 中間証明書)と、STEP4で取得した秘密鍵をサーバーへ設置する

/etc/letsencrypt/archive/live/b17.ddns.net/

インストールの確認

$cat cert.pem |openssl x509 -text -noout

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:85:92:51:53:66:49:fe:d6:7a:17:6a:1a:9f:aa:ab:c2:4c
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = R11
        Validity
            Not Before: Jan  8 00:12:59 2025 GMT
            Not After : Apr  8 00:12:58 2025 GMT
        Subject: CN = rfsec.ddns.net

WordPress のインストールとMysql

参考にしたサイト

https://qiita.com/cherubim1111/items/b259493a39e36f5d524b

TimeZOne設定
sudo su - 
timedatectl set-timezone Asia/Tokyo

Apacheのインストール
apt -y update
apt -y install apache2 
systemctl enable apache2
systemctl start apache2

PHP 7.4 のインストール
apt -y install php7.4 php7.4-mysql

MariaDB 10.5 のインストール
apt -y install mariadb-server mariadb-client
systemctl enable mariadb
systemctl start mariadb

WordPress のインストール
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvf latest-ja.tar.gz
chown -R www-data:www-data .

WordPress 用データベース作成(DB名wirdpressの場合)
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8;

WordPress 用 MariaDB ユーザの作成
CREATE DATABASE wordpress;
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpressuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

MySQLの操作

データベースの一覧表示
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| press              |
| rf                 |
| wp                 |
+--------------------+
6 rows in set (0.001 sec)

データベースのアクセス
MariaDB [(none)]> use press;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

データベースのテーブル表示
Database changed
MariaDB [press]> show tables;
+-----------------------+
| Tables_in_press       |
+-----------------------+
| ww_commentmeta        |
| ww_comments           |
| ww_links              |
| ww_options            |
| ww_postmeta           |
| ww_posts              |
| ww_term_relationships |
| ww_term_taxonomy      |
| ww_termmeta           |
| ww_terms              |
| ww_usermeta           |
| ww_users              |
+-----------------------+
12 rows in set (0.001 sec)

テーブル表示の中身を表示
MariaDB [press]> select * FROM ww_users;
+----+------------+------------------------------------+---------------+---------------------------+---------------------------+---------------------+---------------------+-------------+--------------+
| ID | user_login | user_pass                          | user_nicename | user_email                | user_url                  | user_registered     | user_activation_key | user_status | display_name |
+----+------------+------------------------------------+---------------+---------------------------+---------------------------+---------------------+---------------------+-------------+--------------+
|  1 | mars       | $P$BpsXyK.d4ER7ABVH9hZioBiaGNFvAJ1 | mars          | ei2k-hrai@asahi-net.or.jp | http://ps2.ddns.net/press | 2021-04-01 12:53:41 |                     |           0 | mars         |
+----+------------+------------------------------------+---------------+---------------------------+---------------------------+---------------------+---------------------+-------------+--------------+
1 row in set (0.001 sec)

データベースを削除する
DROP DATABASE [IF EXISTS] db_name

ユーザパスワードをDBから直接変更する方法

https://www.wakuwakubank.com/posts/648-wordpress-userpassword/

UPDATE 対象DB.DB接頭語users                # UPDATE press.ww_users
SET user_pass = MD5('新しいパスワード')     # SET user_pass = MD5('新しいパスワード') 
WHERE user_login = 'パスを変更したいユーザー名';

Seleniumでスクレイピングの準備

$sudo apt-get update
$sudo apt install chromium-chromedriver
$sddo cp /usr/lib/chromium-browser/chromedriver /usr/bin
$pip install selenium
$pip install webdriver_manager

紛らわしい点:webdriver_managerとwebdrivermanagerの両方が存在し、機能が同じではない。webdriver_managerの方が良さそう。

Webサイトのタイトルを取得してみる。

from selenium import webdriver
import time

#---------------------------------------------------------------------------------------
# 処理開始
#---------------------------------------------------------------------------------------
# ブラウザをheadlessモード実行
print("\nブラウザを設定")
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(10)

# サイトにアクセス
print("サイトにアクセス開始")
URL="https://rfsec.ddns.net/db/"
driver.get(URL)
time.sleep(3)
# driver.find_elements_by_css_selector("xxx") 的な処理を自由に
print("サイトのタイトル:", driver.title)

認証があるサイトの場合(中華製ネットワークカメラ)

import time
import base64
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

def get_auth_header(user, password):
    b64 = "Basic " + base64.b64encode('{}:{}'.format(user, password).encode('utf-8')).decode('utf-8')
    return {"Authorization": b64}

# Webdriver ManagerでChromeDriverを取得
driver = webdriver.Chrome(executable_path=ChromeDriverManager().install())

# Authorizationヘッダを付与
driver.execute_cdp_cmd("Network.enable", {})
driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": get_auth_header("admin", "")})
# Basic認証が必要なページにアクセス
driver.get('http://192.168.68.128')
time.sleep(5)

driver.close()
driver.quit()

数独の問題サイトから問題を取得して、解く。

#  ここからがseleniumのコード
#  問題サイト http://numberplace.net/
#
from selenium import webdriver
import time
import numpy as np

def disp(results):
    msg=""
    for r in results:
        for y in range(9):
            for x in range(9):
                c = r._values[y][x]
                c = str(c)
                d = row2[y][x]
                if d != 0:
                    msg=msg+'('+ c + ') '
                else:
                    msg=msg+'-'+ c + '- ' 
            msg=msg+"\n"
    print(msg)

#---------------------------------------------------------------------------------------
# 処理開始
#---------------------------------------------------------------------------------------
# ブラウザをheadlessモード実行
print("\nブラウザを設定")
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(2)

# サイトにアクセス
for num in range(5):
    URL="http://numberplace.net/?no="+str(num+1)
    print("サイトにアクセス開始:",URL)
    driver.get(URL)
    time.sleep(2)
    lines= driver.page_source.splitlines()
    for line in lines:
        if 'toi' in line:
            q = line.split(' ')[3].replace("'","").replace(";","")
            q=list(q)
            #print(q)
            qi = [int(s) for s in q]
            #print(qi)
            q2 = np.array(qi)
            row2=np.array(q2).reshape(-1,9).tolist()
            grid = solver.Grid(row2)
            print(grid)
            results = solver.solve_all(grid)
            disp(results)
            break
print('Done.')

ネットワークカメラ ATOM Cam2で遊ぶ

ATOM Cam2は、防水となっていて屋外にも設置できそうなので、流星の録画・観測向きかもしれない。

こちらのブログを参照して必要なファイルを録画用のSDカードへ配置するだけで、telnet/ftp/rtspを利用できる。

配置の手順などは、こちらのgithubに

ファイルを配置してカメラをrebootし、とりあえずnmapでOS,サービスの情報を表示してみる。

$ sudo nmap -O 192.168.68.74
Starting Nmap 7.70 ( https://nmap.org ) at 2021-10-16 21:05 JST
Nmap scan report for 192.168.68.74
Host is up (0.010s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
23/tcp open  telnet
MAC Address: 7C:DD:E9:01:F0:F1 (Atom Tech)
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3
OS details: Linux 2.6.32 - 3.10
Network Distance: 1 hop

$ nmap -A 192.168.68.74
Starting Nmap 7.70 ( https://nmap.org ) at 2021-10-16 21:04 JST
Nmap scan report for 192.168.68.74
Host is up (0.013s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
21/tcp open  ftp     BusyBox ftpd (D-Link DCS-932L IP-Cam camera)
23/tcp open  telnet  BusyBox telnetd
Service Info: Host: Ingenic; Device: webcam; CPE: cpe:/h:dlink:dcs-932l

RTSPらしいポートが見えないが、説明によると8554/TCPらしいのでポートを指定して、再びnmap。

$ sudo nmap -p8554 -A 192.168.68.74
Starting Nmap 7.70 ( https://nmap.org ) at 2021-10-16 21:25 JST
Nmap scan report for 192.168.68.74
Host is up (0.0036s latency).

PORT     STATE SERVICE VERSION
8554/tcp open  rtsp    DoorBird video doorbell rtspd
|_rtsp-methods: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER
MAC Address: 7C:DD:E9:01:F0:F1 (Atom Tech)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 2.6.X|3.X
OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3
OS details: Linux 2.6.32 - 3.10
Network Distance: 1 hop
Service Info: Device: webcam

ということで、8554/TCPが空いている.

VLCのネットワークストリームを開き、 rtsp://[IPアドレス]:8554/unicast で無事動画を表示することができた。

ブログによると8080/TCPでWebアクセスできて、詳細な設定が可能ということだが、ATOM Cam2のバージョンが違うのか、8080/TCPは開いていないようだ。

ハックの新バージョンが公開されていました。新バージョンで上書き設置し、nmapを実行した結果は、次のとおりでした。ブラウザで http://[IPアドレス]:8080/cgi-bin/honeylab.cgi を開くと、設定画面やステータスが表示され、ftpとrtspの有効化(ON/OFF)が可能となりました。初期状態ではftp/rtspが無効化されている。

PORT     STATE SERVICE
23/tcp   open  telnet
8080/tcp open  http-proxy
9999/tcp open  abyss

telnetでログインして(root/atomcam2) freeコマンドでメモリー容量を確認したら75Kバイトのようだ

 telnet 192.168.68.74
Trying 192.168.68.74...
Connected to 192.168.68.74.
Escape character is '^]'.

Ingenic login: root
Password:

[root@Ingenic:~]# free
             total         used         free       shared      buffers
Mem:         75084        55300        19784            0          200
-/+ buffers:              55100        19984
Swap:            0            0            0

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 3.6M      3.6M         0 100% /
tmpfs                    36.7M      8.0K     36.7M   0% /dev
tmpfs                    36.7M      9.8M     26.9M  27% /tmp
tmpfs                    36.7M      4.0K     36.7M   0% /run
media                    36.7M         0     36.7M   0% /media
/dev/mtdblock3            3.6M      3.6M         0 100% /system
/dev/mtdblock6          384.0K    120.0K    264.0K  31% /configs
/dev/mmcblk0p1           29.1G      1.1G     28.0G   4% /media/mmc
/dev/mmcblk0p1           29.1G      1.1G     28.0G   4% /tmp/mmc
tmpfs                    36.7M      9.8M     26.9M  27% /bin/busybox
tmpfs                    36.7M      9.8M     26.9M  27% /bin
/dev/loop0               45.2M     40.1M      2.0M  95% /tmp/newroot
tmpfs                    36.7M      9.8M     26.9M  27% /etc/passwd
tmpfs                    36.7M      9.8M     26.9M  27% /etc/shadow
/dev/loop0               45.2M     40.1M      2.0M  95% /tmp/newroot/mnt/usr/lib
/dev/loop0               45.2M     40.1M      2.0M  95% /usr
/dev/loop0               45.2M     40.1M      2.0M  95% /usr/lib

参照したブログによると、独自のカーネルで起動することも可能らしい。今後の展開が楽しみだ。

PythonからSSLでメールを送信

STARTTLSを使わない場合

import smtplib, ssl

#送信に利用するメールサーバの設定(プロバイダーのメールアカウント、SMTPサーバー)
username= "aaa@bbb.ccc.ddd"
password=  "xxxxx"
mail_server="smtp.eeee.ffff" # SMTP Server
port=465

#偽装送信元 
fake_from= "donaldtrump@gmail.com"
fake_name= "Donald Trump"

#メールの宛先
to_email= 'hoge@hoge.hoge'
to_name= 'hoge@hoge.hoge'

subject= "Bonjour"
content= "This is the fbi. OPEN UP"
message= f"From: {fake_name} <{fake_from}>\nTo: {to_name} <{to_email}>\nSubject: {subject}\n\n{content}"
server = smtplib.SMTP_SSL(mail_server,port, context=ssl.create_default_context())
server.login(username, password)
server.sendmail(username, to_email, message.encode())
server.close()

MIME機能を付加して、日本語・HTMLのメールを送信

通信のデバッグ情報を表示するには server.set_debuglevel(True) を挿入

import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
smtp_host = 'mail.xxx.xxx' #Mailサーバを指定
smtp_port = 465
smtp_account_id = 'hogehoge' #ユーザー名を指定
smtp_account_pass = 'xxxxxxx' #パスワードを入力
from_mail = "hoge <hoge@xxxx.xxx.xx>"  # 送信元メールアドレス
to_mail = "HOGE <HOGE@xxxx.xxx>"  # 送信先メールアドレス
msg = MIMEMultipart('alternative')
msg['Subject'] = "タイトル" #件名を入力
msg['From'] = from_mail
msg['To'] = to_mail
text = "送信テストです。.nマルチパートで送っています。.nどうですか?"
html = """
<html>
  <head></head>
  <body>
    <p style='font-size:16.0pt;font-family:游ゴシック'>送信テストです。</p>
    <p>マルチパートで送っています。</p>
    <p>どうですか?</p>
  </body>
</html>
"""

part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
msg.attach(part1)
msg.attach(part2)

server = smtplib.SMTP_SSL(smtp_host, smtp_port, context=ssl.create_default_context())
#server.set_debuglevel(True)
server.login(smtp_account_id, smtp_account_pass)
server.sendmail(from_mail, to_mail, msg.as_string())
server.quit()
print('Done.')

helmでインストールしたwordpressのphpスクリプトの場所を特定

/var/snap/microk8s/common/ 以下に置かれているようだ。

$ sudo find / -name wp-login.php 2>/dev/null
/var/snap/microk8s/common/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/179/fs/opt/bitnami/wordpress/wp-login.php
/var/snap/microk8s/common/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/170/fs/opt/bitnami/wordpress/wp-login.php
/var/snap/microk8s/common/run/containerd/io.containerd.runtime.v2.task/k8s.io/6f704f341ec11315ce29fc36f1a4d4c4e7c88b55d460fa0249c7e268b20be2ed/rootfs/opt/bitnami/wordpress/wp-login.php

k8sのサービスへ別マシンから接続

k8sのサービスへ別マシンから接続するには、ポートフォワーディングを設定します。例えばk8sのdashbordをアクセスする場合には、設定に必要な情報を次の手順で取得

$ microk8s kubectl get all --all-namespaces | grep dashboard | grep TCP
kube-system          service/kubernetes-dashboard        ClusterIP      10.152.183.19    <none>        443/TCP

必要な部分は太字の箇所

kube-system service/kubernetes-dashboard ClusterIP 10.152.183.19 443/TCP

外部からアクセスする場合のポートを10443とした場合のportforward設定の例;10443が既に使われていた場合はエラーとなるので、別のポートを指定する。

microk8s.kubectl port-forward --address 0.0.0.0 -n kube-system service/kubernetes-dashboard 10443:443 &

wordpressをアクセスする場合;外部マシンからhttp://xxx.xxx.xxx.xxx:20443/をアクセス

(xxx.xxx.xxx.xxxはk8sマシンのIPアドレス)

microk8s kubectl get all --all-namespaces | grep wordpress | grep TCP
helm-test            service/test-wordpress              LoadBalancer   10.152.183.226   <pending>     80:30034/TCP,443:30311/TC
microk8s.kubectl port-forward --address 0.0.0.0 -n helm-test service/test-wordpress 20443:443 &
Forwarding from 0.0.0.0:20443 -> 8443

helmでwordpressをデプロイ

これまでの失敗の一因:

(1)microk8s config >.kube/configの未実施。

(2)クリーンでない環境へインストールしようとした。(例えば、80/tcpが既に使われていた環境)

$ microk8s config >.kube/config  を実行しておかないと、次のようなエラーとなる。
The connection to the server localhost:8080 was refused - did you specify the right host or port?

#helmをmake
git clone https://github.com/helm/helm.git
cd helm
#ここでmakeすると go が欠落していてエラー snapでgoをインストール
sudo snap install go --classic
make
sudo make install

kubectl create namespace helm-test
namespace/helm-test created

mars@mars-VirtualBox:~$ helm install test bitnami/wordpress --namespace helm-test 
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/mars/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/mars/.kube/config
NAME: test
LAST DEPLOYED: Tue Jun 22 19:46:16 2021
NAMESPACE: helm-test
STATUS: deployed
REVISION: 1
NOTES:
** Please be patient while the chart is being deployed **
Your WordPress site can be accessed through the following DNS name from within your cluster:
    test-wordpress.helm-test.svc.cluster.local (port 80)
To access your WordPress site from outside the cluster follow the steps below:
1. Get the WordPress URL by running these commands:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace helm-test -w test-wordpress'
   export SERVICE_IP=$(kubectl get svc --namespace helm-test test-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
   echo "WordPress URL: http://$SERVICE_IP/"
   echo "WordPress Admin URL: http://$SERVICE_IP/admin"

2. Open a browser and access WordPress using the obtained URL.
3. Login with the following credentials below to see your blog:
  echo Username: user
  echo Password: $(kubectl get secret --namespace helm-test test-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

次のように、wordpressとmariadbが起動している。

helm list -n helm-test

WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /home/mars/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /home/mars/.kube/config
NAME	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART            	APP VERSION
test	helm-test	1       	2021-06-22 19:46:16.598835081 +0900 JST	deployed	wordpress-11.0.16	5.7.2      

$  kubectl get po -n helm-test
NAME                             READY   STATUS    RESTARTS   AGE
test-wordpress-8d8bb84b6-m5b5j   0/1     Running   0          87s
test-mariadb-0                   1/1     Running   0          87s

Adminでログインしたwordpressの画面