本文是為了實作“在自已的android手機上運作檔案伺服器”這個想法而寫的。
本文續 在android搭建個人的檔案中心(2)--Termux 這篇文章。
未完待續
說到檔案伺服器,大家一般會想到ftp。
ftp是明文傳輸,它的安全性沒有密文傳輸的sftp好。sftp與ftp的原理完全不同,它是靠ssh(secure shell)來實作的。
ssh由ssh伺服器和遠端終端或用戶端構成,它們之間進行加密的通迅,是以secure。
根據上述原理,在android運作一個ssh伺服器,在其它裝置運作sftp的用戶端,就可以實作其它裝置對android内部存儲的通路。
1.在Termux上安裝ssh 伺服器
在Termux中安裝openssh[1]。
$ pkg install openssh
如果沒有任何警告,安裝就完成了。
建立密碼[2]
sshd通常有兩種加密方式,一種是密碼,一種是密鑰。密碼就是登陸termux終端的帳戶對應的密碼。我們打開termux終端的時候沒有輸入帳戶名和密碼,這個真實的linux環境是不同的。
為了使用密碼驗證,我們可以在termux終端用passwd指令來建立目前使用者的密碼。
檢查下sshd是否安裝成功首先啟動sshd伺服器,在指令行輸入sshd。通常sshd伺服器的端口一般是22,但termux上是8022,這可能是為了防止沖突。
$ sshd
用ssh指令在termux終端連接配接sshd伺服器。
$ ssh 127.0.0.1 -p 8022
如果是第一次連接配接,會提示你從未連接配接過這個伺服器,問你還連不連“are you sure you want to continue connecting (yes/no/[fingerprint])?”,輸入yes。然後輸入密碼。
如果成功了,會出現一個新打開的termux終端,如下圖所示。
這證明安裝成功了,用exit指令退出這個終端,回到剛才的界面。
$ exit
建立密鑰 [1]
密碼驗證遠沒有密鑰認證安全,僅用于不友善用密鑰的場合。
密鑰可以用下面方法産生。
$ cd
$ ssh-keygen
用cd是為了確定回到home。ssh-keygen會在home下的.ssh檔案夾下産生私鑰id_rsa和公鑰id_rsa.pub。
把公鑰的内容寫到授權鑰匙的名單authorized_keys上。修改公鑰的權限為本人可讀寫,本人之外不可讀寫和運作。
600 ~/.ssh/authorized_keys
私鑰是要放到用戶端指定檔案夾下的,因系統而異,linux是~/.ssh。
2.用sshd作sftp伺服器
一般配置在termux中使用sshd的方法與linux中并無兩樣。
sshd的配置檔案如下寫就行。
PrintMotd no
PasswordAuthentication yes
PubkeyAcceptedKeyTypes +ssh-dss
Subsystem sftp /data/data/com.termux/files/usr/libexec/sftp-server
在termux中使用上面檔案啟動sshd即可
$sshd -f 上面的/配置/檔案/的路徑
僅監聽指定ip 為了更安全,我們通常隻希望家庭區域網路或手機熱點網絡所連接配接的裝置能夠通路手機的sftp 伺服器,而網際網路上其它裝置不管有沒有密鑰都無法通路。
這時我們需要在配置檔案中加上一句ListenAddress $ANDROID_s_IP
家裡的路由和手機的熱點一般是動态配置設定ip,也是就是說手機的ip總是變化的。
是以可以寫個腳本得到android的ip,具體方法因裝置而異,假設腳本的名字是android_ip,且已加入path。
然後我們寫另一個腳本來自動生成sshd的配置檔案,并用它啟動sshd。
#generating .ssh/sshd_config
cat > ~/.ssh/sshd_config <<-_EOF_
PrintMotd no
PasswordAuthentication yes
PubkeyAcceptedKeyTypes +ssh-dss
Subsystem sftp /data/data/com.termux/files/usr/libexec/sftp-server
#ListenAddress $(android_ip)
_EOF_
sshd -f ~/.ssh/sshd_config
參考
- ^abRun an SSH server on your Android with Termux https://glow.li/technology/2015/11/06/run-an-ssh-server-on-your-android-with-termux/
- ^termux wiki remote_accesss https://wiki.termux.com/wiki/Remote_Access