React Native SSH SFTP 組件

分享一下最近寫的 React Native 的 SSH / SFTP 組件,iOS 端封裝了 NMSSH古劲,Android 端封裝了 JSch掰曾。支持 SSH 執(zhí)行命令授账、實(shí)時(shí) Shell 和基本的 SFTP 操作归园,同時(shí)支持密碼或密鑰驗(yàn)證黄虱。

Github repo: react-native-ssh-sftp


安裝

npm install react-native-ssh-sftp --save
react-native link react-native-ssh-sftp

iOS (only)

NMSSH 需要用 Pod 安裝,如果已經(jīng)有 Pod 可以直接 pod 'NMSSH'庸诱。沒有的話按以下步驟初始化后安裝:

  1. 初始化 Pod 文件:
    cd ios
    pod init
    
  2. 打開 Podfile 添加:
    target '[your project's name]' do
        pod 'NMSSH'
    end
    
  3. 安裝:
    pod install
    

手動 Link

react-native link 不好使的情況試一下手動添加:

iOS

  1. 打開 XCode 的 project navigator捻浦,右擊 Libraries ? Add Files to [項(xiàng)目名稱]
  2. 找到 node_modules ? react-native-ssh-sftp 然后選擇 RNSSHClient.xcodeproj
  3. 打開 XCode 的 project navigator,選中你的項(xiàng)目桥爽,添加 libRNSSHClient.a 到項(xiàng)目的 Build Phases ? Link Binary With Libraries

Android

  1. 打開 android/app/src/main/java/[...]/MainActivity.java
    - 添加 import com.reactlibrary.RNSshClientPackage; 到文件開頭的 imports 中
    - 添加 new RNSshClientPackage()getPackages() 方法的列表中
  2. android/settings.gradle 中添加以下內(nèi)容 :
    include ':react-native-ssh-sftp'
    project(':react-native-ssh-sftp').projectDir = new File(rootProject.projectDir,     '../node_modules/react-native-ssh-sftp/android')
    
  3. android/app/build.gradle 文件的 dependencies 中添加:
    compile project(':react-native-ssh-sftp')
    

演示

example

運(yùn)行演示項(xiàng)目

iOS

cd example
cd ios
pod install
cd ..
npm install
react-native run-ios

Android

cd example
npm install
react-native run-android

使用方法介紹

創(chuàng)建 client 并使用密碼驗(yàn)證

import SSHClient from 'react-native-ssh-sftp';

let client = new SSHClient('10.0.0.10', 22, 'user', 'password', (error) => {
  if (error)
    console.warn(error);
});

創(chuàng)建 client 并使用密鑰驗(yàn)證

import SSHClient from 'react-native-ssh-sftp';

let client = new SSHClient('10.0.0.10', 22, 'user', {privateKey: '-----BEGIN RSA......'}, (error) => {
  if (error)
    console.warn(error);
});
  • 密鑰驗(yàn)證的其他格式:
{privateKey: '-----BEGIN RSA......'}
{privateKey: '-----BEGIN RSA......', publicKey: 'ssh-rsa AAAAB3NzaC1yc2EA......'}
{privateKey: '-----BEGIN RSA......', publicKey: 'ssh-rsa AAAAB3NzaC1yc2EA......', passphrase: 'Password'}

關(guān)閉 client

client.disconnect();

執(zhí)行 SSH 命令

var command = 'ls -l';
client.execute(command, (error, output) => {
  if (error)
    console.warn(error);
  if (output)
    console.warn(output);
});

Shell

開啟 shell:

  • ptyType 的可選類型: vanilla, vt100, vt102, vt220, ansi, xterm
var ptyType = 'vanilla';
client.startShell(ptyType, (error) => {
  if (error)
    console.warn(error);
});

從 shell 獲取數(shù)據(jù):

client.on('Shell', (event) => {
  if (event)
    console.warn(event);
});

向 shell 寫數(shù)據(jù):

var str = 'ls -l\n';
client.writeToShell(str, (error) => {
  if (error) 
    console.warn(error);
});

關(guān)閉 shell:

client.closeShell();

SFTP

連接 SFTP

client.connectSFTP((error) => {
  if (error)
    console.warn(error);
});

獲取目錄列表:

var path = '.';
client.sftpLs(path, (error, response) => {
  if (error)
    console.warn(error);
  if (response)
    console.warn(response);
});

創(chuàng)建目錄:

client.sftpMkdir('dirName', (error) => {
  if (error)
    console.warn(error);
});

重命名文件或目錄:

client.sftpRename('oldName', 'newName', (error) => {
  if (error)
    console.warn(error);
});

刪除目錄:

client.sftpRmdir('dirName', (error) => {
  if (error)
    console.warn(error);
});

刪除文件:

client.sftpRm('fileName', (error) => {
  if (error)
    console.warn(error);
});

下載文件:

client.sftpDownload('[path-to-remote-file]', '[path-to-local-direcotry]', (error, downloadedFilePath) => {
  if (error)
    console.warn(error);
  if (downloadedFilePath)
    console.warn(downloadedFilePath);
});

// 獲取下載進(jìn)度
client.on('DownloadProgress', (event) => {
  console.warn(event);
});

// 取消下載
client.sftpCancelDownload();

上傳文件:

client.sftpUpload('[path-to-local-file]', '[path-to-remote-directory]', (error) => {
  if (error)
    console.warn(error);
});

// 獲取上傳進(jìn)度
client.on('UploadProgress', (event) => {
  console.warn(event);
});

// 取消上傳
client.sftpCancelUpload();

斷開 SFTP:

client.disconnectSFTP();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朱灿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钠四,更是在濱河造成了極大的恐慌盗扒,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異环疼,居然都是意外死亡习霹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門炫隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阎曹,你說我怎么就攤上這事伪阶。” “怎么了处嫌?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵栅贴,是天一觀的道長。 經(jīng)常有香客問我熏迹,道長檐薯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任注暗,我火速辦了婚禮坛缕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捆昏。我一直安慰自己赚楚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布骗卜。 她就那樣靜靜地躺著宠页,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寇仓。 梳的紋絲不亂的頭發(fā)上举户,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機(jī)與錄音遍烦,去河邊找鬼俭嘁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乳愉,可吹牛的內(nèi)容都是我干的兄淫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蔓姚,長吁一口氣:“原來是場噩夢啊……” “哼捕虽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坡脐,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤泄私,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晌端,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捅暴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咧纠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓬痒。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖漆羔,靈堂內(nèi)的尸體忽然破棺而出梧奢,到底是詐尸還是另有隱情,我是刑警寧澤演痒,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布亲轨,位于F島的核電站,受9級特大地震影響鸟顺,放射性物質(zhì)發(fā)生泄漏惦蚊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一讯嫂、第九天 我趴在偏房一處隱蔽的房頂上張望蹦锋。 院中可真熱鬧,春花似錦端姚、人聲如沸晕粪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巫湘。三九已至,卻和暖如春昏鹃,著一層夾襖步出監(jiān)牢的瞬間尚氛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工洞渤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阅嘶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓载迄,卻偏偏與公主長得像讯柔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子护昧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容