rpm -qa | grep initscriptshtml
which vsftpd前端
service vsftpd statusvue
service vsftpd startnode
service vsftpd restartlinux
netstat -an | grep 21 //默认端口为21nginx
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTENshell
若是看到以上信息,证实ftp服务已经开启。npm
https://blog.csdn.net/bluishglc/article/details/42273197segmentfault
ftp不能够传文件夹,lftp能够,lftp可使用账号密码登陆bash
choco install lftp
没有安装choco 请点下方连接,本身食用
https://chocolatey.org/install
https://blog.csdn.net/lizexing1/article/details/79308961
https://blog.csdn.net/imliuqun123/article/details/83340763
https://www.runoob.com/linux/linux-shell.html
为啥要 ./qq.sh 这样执行, 好像有坑
请确保ftp服务已经开启,再作下面的操做
新建一个qq.sh文件,大体就是是用ftp连接远程服务器,并传输一个zip文件
#!/bin/sh # 出现异常不往直接报错 set -e # 打包 tar -czvf social.zip social # 远端服务器ip ip="192.168.1.99" # 部署到远程服务器的目录 自行更换 remote="/usr/abcd/" # 账号 自行更换 userName="admin" # 密码 自行更换 password="123456" # 传输方式 ftpFransferType="binary" # 传输的文件名 ftpPutFileName="social.zip" #lcd 应该使用相对路径 #格式:lcd [directory] #说明:directory 指定要更改的本地计算机上的目录。若是没有指定directory,将显示本地计算机中当前的工做目录 #从本地向FTP批量上传文档 echo "-------------------------------------- 开始上传 ${ftpPutFileName} 文件--------------------------------------" ftp -v -n<<EOF open $ip user $userName $password $ftpFransferType cd $remote pwd prompt put $ftpPutFileName bye EOF echo "-------------------------------------- 上传 ${ftpPutFileName} 文件成功 --------------------------------------"
直接把文件夹丢到服务器
#!/bin/bash #-------------------------------------------- # 自动传输文件到不一样环境 # author:qinyuanqi #-------------------------------------------- #出现异常不往下面走 set -e # SFTP配置信息 # IP IP="192.168.1.199" # 端口 PORT=22 # 用户名 USER="user" # 密码 PASSWORD="password" # 须要上传的文件所在目录 CLIENTDIR='./social' # 上传到目标服务器的目录 remote="/usr/local/nginx/html/h5/" #echo "$IP---$USER--$PASSWORD" if [ -d $CLIENTDIR ] then echo "$CLIENTDIR 是一个文件夹" elif [ -f $CLIENTDIR ] then echo "$CLIENTDIR 是一个文件" else echo "$CLIENTDIR 不存在" fi if [ "$1"x == "test"x ] then echo "---- 准备传输 $CLIENTDIR 文件到 ----测试环境" # 这样传输到服务器,访问项目,nginx会报403,测试大佬说不能改nginx 配置,难搞哦,不知道怎么解决了 IP="192.168.1.166" USER="测试环境的用户" PASSWORD="测试环境的密码" else echo "---- 准备传输 $CLIENTDIR 文件到 ----开发环境" fi echo "---- 开始上传 ${CLIENTDIR} 文件 ----" lftp -u $USER,$PASSWORD $IP <<EOF cd ${remote} mirror -R $CLIENTDIR by EOF echo "---- 上传 ${CLIENTDIR} 文件成功 ----"
解决办法:
// 开发和测试自动打包到对一个环境,生产自动打zip包,直接丢给领导上线 //命令行颜色 const chalk = require('chalk') const log = console.log const path = require('path') // 链接传输到服务器插件 const NodeSSH = require('node-ssh') const ssh = new NodeSSH() // 取到node执行文件的参数,进行打包区分 const argv = process.argv.slice(2) // 引入压缩文件插件 const compressing = require('compressing') // 打包后的目录名称 const buildDirName = 'social' // 打包后文件的路径 const distDir = './' + buildDirName // 打包后的压缩名称 const distZipPath = './' + buildDirName + '.zip' // 服务器配置 let remoteConfig = {} // node deploy.js qq 取到qq来作判断,判断是那个环境,而后作不一样的处理 switch (argv[0]) { // 开发环境的一些配置 case 'dev': log(chalk.blue('----开始打包到开发环境----')) remoteConfig = { host: '开发服务器ip', // 远程端口,默认是21 // port:21 username: '开发服务器用户名', password: '开发服务器密码', remotePath: '服务器部署的地址', } upload() break // 测试环境的一些配置 case 'test': log(chalk.blue('----开始打包到测试环境----')) remoteConfig = { host: '测试服务器ip', // 远程端口,默认是21 // port:21 username: '测试服务器用户名', password: '测试服务器密码', remotePath: '测试服务器部署地址', } upload() break // 生产环境就自动压缩文件,不作别的处理 case 'production': log(chalk.blue('----生产环境----开始压缩文件----')) compressing.zip .compressDir(distDir, distZipPath) .then(() => { log(chalk.green(`压缩 ${distZipPath} 成功`)) }) .catch(() => { log(chalk.red(`压缩 ${distZipPath} 失败`)) }) break default: log(chalk.keyword('orange')('deploy走了没有处理的方式')) break } /** * 上传文件到服务器 * node 7.6 以上都支持 async 语法 */ async function upload() { const failed = [] const successful = [] try { // 链接服务器 await ssh.connect({ host: remoteConfig.host, username: remoteConfig.username, password: remoteConfig.password, }) // 刪除目录再上传 await ssh.execCommand('rm -rf ../' + buildDirName, { cwd: remoteConfig.remotePath }) // 开始上传文件到远程指定目录下 await ssh.putDirectory(distDir, remoteConfig.remotePath, { recursive: true, concurrency: 10, validate: function(itemPath) { const baseName = path.basename(itemPath) console.log(baseName) return ( baseName.substr(0, 1) !== '.' && baseName !== 'node_modules' // do not allow dot files ) // do not allow node_modules }, tick: function(localPath, remotePath, error) { if (error) { failed.push(localPath) } else { successful.push(localPath) } }, }) } catch (error) { log(chalk.red('upload 上传失败,错误信息以下==>', error)) return false } log(chalk.green('传输完成')) log(chalk.green('传输成功文件数==>', successful.length)) log(chalk.green('传输失败文件数==>', failed.length)) // 退出 process.exit() }