Ubuntu 18.04的ssh版本中,root用户默认被禁止连接
需要编辑 /etc/ssh/sshd_config 文件
sudo vi /etc/ssh/sshd_config
找到PermitRootLogin,设为yes
PermitRootLogin yes
重启ssh服务
sudo systemctl restart ssh
Ubuntu 18.04的ssh版本中,root用户默认被禁止连接
需要编辑 /etc/ssh/sshd_config 文件
sudo vi /etc/ssh/sshd_config
找到PermitRootLogin,设为yes
PermitRootLogin yes
重启ssh服务
sudo systemctl restart ssh
php-fpm 配置名称视具体版本而定
sudo vi /etc/php/7.2/fpm/php.ini
找到以下两项,修改为自己想要的值,比如50M
post_max_size = 50M
upload_max_filesize = 50M
sudo systemctl restart php7.2-fpm
sudo systemctl restart nginx
public class FileUtil
{
[DllImport("kernel32.dll")]
private static extern IntPtr _lopen(string lpPathName, int iReadWrite);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hHandle);
private const int OF_READWRITE = 2;
private const int OF_SHARE_DENY_NONE = 0x40;
private static readonly IntPtr HFILE_ERROR = new IntPtr(-1);
/// <summary>
/// 查看文件是否被占用
/// </summary>
/// <param name="filePath">文件路径</param>
/// <returns></returns>
public static bool IsOccupied(string filePath)
{
IntPtr vHandle = _lopen(filePath, OF_READWRITE | OF_SHARE_DENY_NONE);
if(vHandle == HFILE_ERROR)
{
return true;
}
CloseHandle(vHandle);
return false;
}
}
微软官方从.NET Framework 4之后不再支持System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(string password, string passwordFormat)
方法。MD5加密需要自行实现。需要注意的是该方法加密结果是小写,而 HashPasswordForStoringInConfigFile
加密结果是大写
public static string MD5Encrypt(string input)
{
StringBuilder builder = new StringBuilder();
using (MD5CryptoServiceProvider md5Crypto = new MD5CryptoServiceProvider())
{
byte[] data = md5Crypto.ComputeHash(Encoding.UTF8.GetBytes(input));
for (int i = 0; i < data.Length; i++)
{
builder.Append(data[i].ToString("x2"));
}
}
return builder.ToString();
}
using System;
using System.Text;
using System.Security.Cryptography;
namespace Utility.Security
{
/// <summary>
/// DES加密/解密类。
/// </summary>
public class DESEncrypt
{
/// <summary>
/// 加密数据
/// </summary>
public static string Encrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray;
inputByteArray = Encoding.Default.GetBytes(Text);
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
}
/// <summary>
/// 解密数据
/// </summary>
public static string Decrypt(string Text, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
int len;
len = Text.Length / 2;
byte[] inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
}
}
关于内核版本的定义:
版本性质:主分支ml(mainline),稳定版(stable),长期维护版lt(longterm)
版本命名格式为 “A.B.C”:
数字 A 是内核版本号:版本号只有在代码和内核的概念有重大改变的时候才会改变,历史上有两次变化:
数字 B 是内核主版本号:主版本号根据传统的奇-偶系统版本编号来分配:奇数为开发版,偶数为稳定版
数字 C 是内核次版本号:次版本号是无论在内核增加安全补丁、修复bug、实现新的特性或者驱动时都会改变
uname -r
3.10.0-514.el7.x86_64
升级内核需要先导入elrepo的key,然后安装elrepo的yum源:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
如果要安装ml内核,使用如下命令:
yum --enablerepo=elrepo-kernel -y install kernel-ml-devel kernel-ml
如果要安装lt内核,使用如下命令:
yum --enablerepo=elrepo-kernel -y install kernel-lt-devel kernel-lt
grub2-set-default 0 grub2-mkconfig -o /boot/grub2/grub.cfg
查看已安装的内核
rpm -qa | grep kernel
删除旧内核
yum remove 内核名称
移除旧版本
yum remove kernel-tools-libs kernel-tools -y
安装新版本
如果安装ml版本执行:
yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-ml-tools
如果安装lt版本执行:
yum --disablerepo=* --enablerepo=elrepo-kernel install kernel-lt-tools
reboot
重启机器,然后查看内核版本uname -r
5.3.8-1.el7.elrepo.x86_64
由于IE 家族jscript不支持find,需要而外代码实现Array属性find的扩展
if (!Array.prototype.find) { Array.prototype.find = function (callback) { for(var i in this){ if (callback(this[i], i, this)) { return this[i]; } } return null; } }
function downloadBase64(base64, fileName) {
base64 = base64.replace(/.+;base64,/, '');
var byteCharacters = atob(base64);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], { type: 'application/octet-stream' });
if (navigator.msSaveOrOpenBlob) {// if IE
navigator.msSaveBlob(blob, fileName);
} else { //if not IE
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
window.URL.revokeObjectURL(link.href);
}
}
比较好用的 js 时间格式化方法,复杂的多种格式。
Date.prototype.format = function (mask) {
var d = this;
var zeroize = function (value, length) {
if (!length) length = 2;
value = String(value);
for (var i = 0, zeros = ''; i < (length - value.length) ; i++) {
zeros += '0';
}
return zeros + value;
};
return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])\1?|[lLZ])\b/g, function ($0) {
switch ($0) {
case 'd':
return d.getDate();
case 'dd':
return zeroize(d.getDate());
case 'ddd':
return ['Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat'][d.getDay()];
case 'dddd':
return ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][d.getDay()];
case 'M':
return d.getMonth() + 1;
case 'MM':
return zeroize(d.getMonth() + 1);
case 'MMM':
return ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][d.getMonth()];
case 'MMMM':
return ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][d.getMonth()];
case 'yy':
return String(d.getFullYear()).substr(2);
case 'yyyy':
return d.getFullYear();
case 'h':
return d.getHours() % 12 || 12;
case 'hh':
return zeroize(d.getHours() % 12 || 12);
case 'H':
return d.getHours();
case 'HH':
return zeroize(d.getHours());
case 'm':
return d.getMinutes();
case 'mm':
return zeroize(d.getMinutes());
case 's':
return d.getSeconds();
case 'ss':
return zeroize(d.getSeconds());
case 'l':
return zeroize(d.getMilliseconds(), 3);
case 'L':
var m = d.getMilliseconds();
if (m > 99) m = Math.round(m / 10);
return zeroize(m);
case 'tt':
return d.getHours() < 12 ? 'am' : 'pm';
case 'TT':
return d.getHours() < 12 ? 'AM' : 'PM';
case 'Z':
return d.toUTCString().match(/[A-Z]+$/);
// Return quoted strings with the surrounding quotes removed
default:
return $0.substr(1, $0.length - 2);
}
});
};
实现String转bytes属性扩展
String.prototype.toBytes = function () {
var ch, st, re = [];
for (var i = 0; i < this.length; i++) {
ch = this.charCodeAt(i); // get char
st = []; // set up "stack"
do {
st.push(ch & 0xFF); // push byte to stack
ch = ch >> 8; // shift value down by 1 byte
}
while (ch);
// add stack contents to result
// done because chars have "wrong" endianness
re = re.concat(st.reverse());
}
// return an array of bytes
return re;
}