密码字段必须通过form.credentialField生成PasswordGuid得到。
首先第一步,制作credential form交互页用来得到Password Guid,所以得写一个Suitelet类型的脚本。
/** *@NApiVersion 2.x *@NScriptType Suitelet *@Author Yi */ function isObject(mixed){ return typeof mixed === 'object' && mixed !== null; } define(['N/runtime', 'N/ui/serverWidget'], function(runtime, serverWidget){ function debug(msg){ log.debug({ title: 'Suitelet debug', details: isObject(msg) ? JSON.stringify(msg) : msg }); } function createSftpConfigForm(){ //构建配置项收集表单(sftp服务器地址+suitescript id),用于生成Credentail Guid var form = serverWidget.createForm({ title: 'Sftp configurations.' }); var hostField = form.addField({ id: 'custfield_host_name', label: 'SFTP host names or IPs', type: serverWidget.FieldType.TEXT }); //此字段用来收集sftp服务器的地址,可以是ip,也可以是domain.多个地址用逗号隔开 hostField.maxLength = 256; hostField.isMandatory = true; var scriptIdsField = form.addField({ id: 'custfield_scriptids', label: 'Restrict to script IDs', type: serverWidget.FieldType.TEXT });//GUID要在哪些suitescript中使用,则必须将那些scriptid(不是那个数字id,是可以自定义的那个)配置进来,多个用逗号分隔。 scriptIdsField.maxLength = 256; scriptIdsField.isMandatory = true; var stepField = form.addField({ id: 'custfield_step', label: 'Step number', type: serverWidget.FieldType.TEXT }); stepField.defaultValue = '1'; stepField.updateDisplayType({ displayType: serverWidget.FieldDisplayType.HIDDEN }); form.addSubmitButton({ label: 'Submit' }); return form; } function createCredentialForm(serverWidget, scriptIds, domains) { //构建凭据表单 var form = serverWidget.createForm({ title: 'Creating SFTP Credential' }); var credField = form.addCredentialField({ id: 'custfield_sftp_password_token', label: 'SFTP Password For EC2', restrictToScriptIds: scriptIds, //e.g.['customscript147'] restrictToDomains: domains, //e.g.['22.123.11.23'] restrictToCurrentUser: false }); credField.maxLength = 256; var stepField = form.addField({ id: 'custfield_step', label: 'Step number', type: serverWidget.FieldType.TEXT }); stepField.defaultValue = '2'; stepField.updateDisplayType({ displayType: serverWidget.FieldDisplayType.HIDDEN }); form.addSubmitButton({ label: 'Submit' }); return form; } function onRequest(context){ var request = context.request; var response = context.response; try { if (request.method === 'GET') { //build form var form = createSftpConfigForm(); response.writePage(form); } if (request.method === 'POST'){ var step = request.parameters.custfield_step; if (step == '1') { var scriptIds = request.parameters.custfield_scriptids; var domains = request.parameters.custfield_host_name; var form = createCredentialForm( serverWidget, scriptIds.split(',').map(function (ele) { return new String(ele).trim()}), domains.split(',').map(function (ele) { return new String(ele).trim()}) ); response.writePage(form); } if (step == '2') { var passwordToken = request.parameters.custfield_sftp_password_token; response.write(passwordToken);//这个就是要配置到sftp中的Password Guid. } } } catch(e) { debug(e); response.write({ output: isObject(e) ? JSON.stringify(e) : e }); } } return { onRequest: onRequest }; } );脚本写好之后,上传到file cabinet中,然后选择此file生成Scripting记录,再将此script生成Script Deployment. deploy之后,可以看到URL有一个链接, 访问此链接就可以通过输入参数(假设调用sftp的scriptid为customscript147,严格来说,调用sftp的script要先于此上传并生成scripting记录,以得到scriptid, 其PasswordGuid留空即可,等此步骤生成了Guid再填充进去。另外一个办法是先自定义一个合法的scriptid并指定给需要调用sftp的脚本)得到Password Guid, 复制此Guid, 以备接下来使用。
第二步,调用sftp脚本的编写
/** *@NApiVersion 2.x *@NScriptType Suitelet *@Author Yi */ function isObject(mixed){ return typeof mixed === 'object' && mixed !== null; } define(['N/runtime', 'N/file', 'N/sftp'], function(runtime, file, sftp){ function debug(msg){ log.debug({ title: 'Suitelet debug', details: isObject(msg) ? JSON.stringify(msg) : msg }); } const PASSWORD_GUID = 'aa033cac51ab479bb0cbf307f3af9d75'; function transferFile(fileConfig, onError){ try { var sftpConfig = { 'host': '33.231.168.161', 'user': 'nssftp', 'guid': PASSWORD_GUID, //步骤一生成的 'port': 22, 'dir' : 'shared' //sftp目录 }; var sftpHost = { 'hostKey': 'Ztb2Ii7TGy...m9', //ssh-keyscan -t rsa -p 22 33.231.168.161 , 注意aws入站规则要开放对外端口22才能执行成功 'hostKeyType': 'rsa' }; var conn = sftp.createConnection({ username: sftpConfig.user, passwordGuid: sftpConfig.guid, url: sftpConfig.host, port: sftpConfig.port, directory: sftpConfig.dir, hostKey: sftpHost.hostKey, hostKeyType: sftpHost.hostKeyType }); conn.upload(fileConfig); return true; } catch(e) { typeof onError === 'function' && onError(e); return false; } } function onRequest(context){ var request = context.request; var response = context.response; try { if (request.method === 'GET') { var fileId = request.parameters.fileid ; if (fileId > 0) { var fileObj = file.load({id: fileId}); var result = transferFile({ filename: fileObj.name, file: fileObj, replaceExisting: true }, function (e){ response.write(isObject(e) ? JSON.stringify(e) : e); }); response.write(result ? 'OK' : 'ERROR'); } } else { response.write('method not handled.'); } } catch(e) { debug(e); response.write({ output: isObject(e) ? JSON.stringify(e) : e }); } } return { onRequest: onRequest }; } );