メインコンテンツへスキップ

SSHクライアント

サーバー上でコマンドを実行し、ファイルを転送します。

はじめに​

NetunoはローコードフレームワークにSSHクライアントを統合しており、サーバーへの接続、コマンドの実行、ファイルの送受信、フォルダーの変更など、その他のリモート操作が可能です。

複数の同時接続をサポートし、さらにSCPとSFTPにも対応します。

これは、オープンソースのJava実装である SSHJのおかげであり、Netunoが_sshリソースを通じてすべてのスクリプト言語にこれらの機能を提供できる理由です。

NetunoのSSHリソースの詳細。

設定​

最初のステップは、Netunoが接続に使用するSSHアクセス情報を設定することです。

開発中のアプリケーション内で、環境設定ファイルまで移動します。この例では、次の場所にある開発用ファイルを使用します:

  • config/_development.json

SSHの設定があるか確認し、存在しない場合は設定ファイル(JSON形式)の末尾にSSH設定パラメータを追加します。例:

{
...
"ssh": {
"default": {
"enabled": true,
"host": "my.server.net",
"port": 22,
"username": "root",
"password": "$eCr37"
}
},
...
}

変更を保存した後、設定変更を反映するにはNetunoを再起動するだけです。これらは、キー名defaultが示すとおり、接続のデフォルト設定です。

JSON内で他のキーを使ってSSH接続設定をさらに追加できます。

SSH接続設定をさらに追加するには、デフォルト設定ブロックを繰り返し、defaultキーを任意の別名に置き換えるだけです。例:

{
...
"ssh": {
"default": {
"enabled": true,
"host": "my.server.net",
"port": 22,
"username": "root",
"password": "$eCr37"
},
"other": {
"enabled": true,
"host": "my.other-server.net",
"port": 22,
"username": "root",
"password": "$eCr37"
}
},
...
}

上記の設定により、次のようにコーディングした場合はdefaultアカウントを使用できます:

const ssh = _ssh.init()

other設定を使用するには、設定キーを_ssh.init()関数のパラメータとして追加するだけです。次のようにします:

const sshOther = _ssh.init("other")

パラメータとして設定名を追加しない場合は、defaultアカウントの設定が使用されます。

接続​

何かを行う前に、SSH接続を開始する必要があります:

ssh.connect()

コマンド​

コマンドを実行するには、コマンドセッションを開始する必要があります:

const sshSession = ssh.initSession()

コマンドを実行すると、実行状態と対応する出力データ(output)を含むオブジェクトが提供されます。例:

const sshCommandResult = sshSession.exec("ls -rato")
if (sshCommandResult.ok) {
_out.println("正常に実行されました:")
_out.println(sshCommandResult.output())
} else {
_out.println("コマンドが失敗しました:")
_out.println(sshCommandResult.error())
}

コマンドによって返されるオブジェクトはSSHExecResultです。

セッションは常に閉じるようにしてください:

sshSession.close()

SCP​

SCPを介してファイルを送受信できます。

文字列からテキストファイルを作成し、作成したファイルの内容をダウンロードする例を次に示します:

const sshSCP = ssh.initSCP()
// テキストファイルを作成します。
sshSCP.uploadText("hello.txt", "こんにちは!ここに内容があります...")
// ファイルの内容をダウンロードして出力します。
_out.println(sshSCP.downloadText("hello.txt"))
sshSCP.close()

アプリケーション内に存在するファイルをアップロードするには:

const sshSCP = ssh.initSCP()
// storage/filesystem にあるファイルを送信します。
sshSCP.upload("spreadsheet.xlsx", _storage.filesystem("server", "spreadsheet.xlsx").file())
// アプリケーションのルートにあるファイルを送信します。
sshSCP.upload("document.pdf", _app.file("document.pdf"))
sshSCP.close()

サーバーからアプリケーションへファイルをダウンロードするには:

const sshSCP = ssh.initSCP()
// ファイルを storage/filesystem にダウンロードします。
sshSCP.download("spreadsheet.xlsx", _storage.filesystem("server", "spreadsheet.xlsx").file())
// ファイルをアプリケーションのルートにダウンロードします。
sshSCP.download("document.pdf", _app.file("document.pdf"))
sshSCP.close()

SFTP​

SFTPはファイルとフォルダーの転送および操作の一形態で、FTPと同じ機能をサポートしますが、SSHを使用します。

新しいSFTPセッションを開始するには:

const sftp = ssh.initSFTP()

セッションのクライアントであるSSHSFTPオブジェクトを開始します。

リモートで新しいフォルダーを作成します:

sftp.createDirectory("path/new-folder")

渡されたテキスト内容でリモートファイルを作成または置換します:

sftp.uploadText("folder/file.txt", "私の内容!")

リモートファイルのテキスト内容を取得します:

const remoteFileContent = sftp.downloadText("folder/file.txt")
_out.println(remoteFileContent)

リモートファイルを完全に削除します:

sftp.deleteFile("folder/file.txt")

リモートフォルダーを完全に削除します:

sftp.deleteDirectory("folder")

フォルダーのすべての内容を一覧表示します:

for (const i of sftp.list("path/folder")) {
if (i.directory) {
_out.print("フォルダー: ")
} else if (i.regularFile) {
_out.print("ファイル: ")
} else {
_out.print("その他: ")
}
_out.println(i.name)
_out.println("<br/>")
}

SSHFile型のオブジェクトのリストを返します。

アプリケーション内に存在するファイルをアップロードするには:

// storage/filesystem にあるファイルを送信します。
sftp.upload("spreadsheet.xlsx", _storage.filesystem("server", "spreadsheet.xlsx").file())
// アプリケーションのルートにあるファイルを送信します。
sftp.upload("document.pdf", _app.file("document.pdf"))

サーバーからアプリケーションへファイルをダウンロードするには:

// ファイルを storage/filesystem にダウンロードします。
sftp.download("spreadsheet.xlsx", _storage.filesystem("server", "spreadsheet.xlsx").file())
// ファイルをアプリケーションのルートにダウンロードします。
sftp.download("document.pdf", _app.file("document.pdf"))

SFTPセッションは常に閉じるようにしてください:

sftp.close()