Node.js - TypeScript - dùng ssh2-sftp-client với SFTP server tự tạo trên localhost - phần 1 - kết nối 📂 🍻
Source-code được viết theo phong các async
- await
.
Cài đặt ssh2-sftp-client
vào project Node.js - TypeScript
Mình đã dựng sẵn 1 base project dành cho Node.js - TypeScript tại đây.
Cài đặt ssh2-sftp-client:
pnpm add ssh2-sftp-client
pnpm add -D @types/ssh2-sftp-client
Chú ý là bạn có thể thay pnpm - package manager bằng yarn hoặc npm.
Giờ ta sẽ sử dụng SFTP Servers
được dựng trên ngay chính localhost để test.
Tạo SFTP server trên localhost
Tham khảo bài viết setup-a-local-sftp-server-for-development trên môi trường Ubuntu:
sudo apt install openssh-server
sudo groupadd sftponly
sudo mkdir /sftp/
sudo chown root:sftponly /sftp/
sudo chmod 2755 /sftp/
# The 2 is for g+s
Thêm đoạn config sau vào cuối file /etc/ssh/sshd_config
:
sudo nano /etc/ssh/sshd_config
config:
Match Group sftponly
ChrootDirectory /sftp/
ForceCommand internal-sftp
AllowTcpForwarding no
sudo service ssh restart
Tự tạo 1 folder files
để test:
sudo mkdir /sftp/files/
# Allow sftponly users to upload files
sudo chmod 2775 /sftp/files/
Tạo ra 1 file JSON để test và copy nó lên thư mục files
vừa tạo. Tạo test.json
với nội dung:
{
"content": "this is my testing content"
}
sudo cp test.json /sftp/files/
Tạo user để SFTP:
sudo useradd -M -G sftponly newUser
sudo passwd newUser
# set password
sudo -u newUser sftp localhost
Thêm user hiện tại vào group đã tạo bên - sftponly
trên:
sudo usermod -a -G sftponly $USER
Kết nối
Tại src/utils/index.ts
viết hàm common:
import Client from 'ssh2-sftp-client';
export const sftpConnect = async (
host: string,
port: number,
username: string,
password: string
): Promise<Client> => {
const sftp = new Client('download-test-json-client');
await sftp.connect({
host,
port,
username,
password,
});
return sftp;
};
Kiểm tra sự tồn tại của file/folder
Tại src/index.ts
viết hàm main
sử dụng sftpConnect
:
import { sftpConnect } from '@utils';
const main = async () => {
try {
const sftp = await sftpConnect('localhost', 22, 'newUser', 'newUser');
let path: string;
let type: string | boolean;
path = '/files';
type = await sftp.exists(path);
console.log(`🌄 ~ ${path} type: `, type);
path = '/files/test.json';
type = await sftp.exists(path);
console.log(`🍻 ~ ${path} type: `, type);
path = '/files/non-exist-test.json';
type = await sftp.exists(path);
console.log(`🌑 ~ ${path} type: `, type);
} catch (err: any) {
console.log(err, 'catch error');
}
};
main();
Trong đó await sftpConnect('localhost', 22, 'newUser', 'newUser')
là thông tin ta vừa tạo SFTP server bên trên.
sftp.exists
sẽ trả về Promise<false | FileInfoType>
.
Theo thông tin từ package @types/ssh2-sftp-client
thì:
type FileInfoType = 'd' | '-' | 'l';
Ta hãy xem output khi chạy đoạn code trên sẽ là gì.
pnpm start
Output:
🌄 ~ /files type: d
🍻 ~ /files/test.json type: -
🌑 ~ /files/non-exist-test.json type: false
Như vậy, ta đã xác nhận là đã kết nối thành công tới SFTP server.
-
là filed
là directoryfalse
là không tồn tại
Phần 2 mình sẽ thử việc download và upload file.
Photo by Drew Beamer on Unsplash