===============
== ffff65535 ==
===============
十六个一(1111 1111 1111 1111)

Linux使用密钥登录并禁用密码登录

ssh 密钥登录 安全
生成密钥
# 生成rsa密钥对
ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  # 直接enter
Enter passphrase (empty for no passphrase):               # 直接enter
Enter same passphrase again:                              # 直接enter
Your identification has been saved in /root/.ssh/id_rsa   # 生成的私钥
Your public key has been saved in /root/.ssh/id_rsa.pub   # 生成的公钥
安装公钥
# 进入公钥目录
cd /root/.ssh/
# 将公钥写入 /root/.ssh/authorized_keys文件
cat id_rsa.pub >> authorized_keys
设置.ssh权限,防止无法登录
chmod 600 authorized_keys
chmod 700 ~/.ssh
设置ssh打开密钥登录功能
vim /etc/ssh/sshd_config


# 启用密钥验证
PubkeyAuthentication yes
# 关闭密码登录
PasswordAuthentication no

# 允许root用户通过ssh登录
PermitRootLogin yes

重启ssh服务

sudo systemctl restart sshd
如果可以使用密码登录
cat /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication yes

# 将yes改为no 或者直接删除该文件(50-cloud-init.conf)
PasswordAuthentication no

Linux调整LVM分区

lvm 分区 debian

lv分区调整

df -h
umount /home
e2fsck -f /dev/mapper/debian--vg-home
resize2fs /dev/mapper/debian--vg-home 5G
lvreduce -L 5G /dev/mapper/debian--vg-home
mount /home
df -h
lvextend -L 5G /dev/mapper/debian--vg-home     #增大至5G
lvextend -L +5G /dev/mapper/debian--vg-home     #增加5G
lvreduce -L 5G /dev/mapper/debian--vg-home    #减小至5G
lvreduce -L -5G /dev/mapper/debian--vg-home      #减小5G

创建lv分区

lvcreate -L 200G VG名字 -n LV名字
例:lvcreate -L 200G vg -n system

lvm创建swap


# 创建lv [-C y]参数 该参数用来指定逻辑卷的空间分配是连续的
lvcreate -C y -L 4G debian-vg -n swap_1
# 格式化
root@debian:~# mkswap /dev/debian-vg/swap_1 

# vim /etc/fstab 添加
/dev/mapper/debian--vg-swap_1 swap swap sw 0 0 
 swapon -va

Ubuntu使用git无法读取远程仓库

git ssh ubuntu 代理

使用git pull时提示

kex_exchange_identification: Connection closed by remote host
Connection closed by 20.205.243.166 port 22
fatal: 无法读取远程仓库。  请确认您有正确的访问权限并且仓库存在。
fatal: Could not read from remote repository.

可能是使用了网络代理导致的,可以使用443端口进行ssh连接 可参考一下链接进行处理 https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port

阅读全文...

windows 环境运行jacob的一些报错处理

jacob word2pdf 报错排查

com.jacob.com.ComFailException: VariantChangeType failed

报错信息如下

com.jacob.com.ComFailException: VariantChangeType failed

解决方案: win2008 以下 需要在 C:\Windows\System32\config\systemprofile\Desktop 建立文件夹 win2008 及以上 需要在 C:\Windows\SysWOW64\config\systemprofile\Desktop

可以直接执行下边的powershell脚本创建

if((Test-Path "C:\Windows\System32\config\systemprofile\Desktop") -ne "True")
{
    New-Item -Path "C:\Windows\System32\config\systemprofile\Desktop" -ItemType Directory
}

if((Test-Path "C:\Windows\SysWOW64\config\systemprofile\Desktop") -ne "True")
{
    New-Item -Path "C:\Windows\SysWOW64\config\systemprofile\Desktop" -ItemType Directory
}

SaveAs Source: Microsoft PowerPoint Description: Presentation.SaveAs : PowerPoint 无法将 ^0 保存到 ^1。

报错信息如下

阅读全文...

Windows powershell

powershell 自动化脚本
  • 判断指定文件夹是否存在,若存在则删除文件夹内所有文件与子目录
$CONFIG_PATH="C:\test"
$TRUE_FALSE=(Test-Path $CONFIG_PATH)
if($TRUE_FALSE -eq "True")
{
    ls $CONFIG_PATH | Remove-Item -Recurse
}
  • 判断指定bat文件是否存在,存在则执行该文件
$CONFIG_PATH="C:\test\test.bat"
$TRUE_FALSE=(Test-Path $CONFIG_PATH)
if($TRUE_FALSE -eq "True")
{
    start $CONFIG_PATH
}

jdk11 httpclient的基本使用

jdk11 httpclient http2

构建请求参数java.net.http.HttpRequest

  • 请求 URI
  • 请求类型(GET、PUT、POST、DELETE)
  • 请求体
  • 超时时间
  • 请求请求头
HttpRequest request = HttpRequest.newBuilder()
        // 请求url
        .uri(URI.create("http://openjdk.java.net/"))
        // 超时时间
        .timeout(Duration.ofMinutes(1))
        // 请求头
        .header("Content-Type", "application/json")
        // 请求类型GET、POST、PUT、DELETE
        .POST(HttpRequest.BodyPublishers.ofString("请求体"))
        .build();

发送请求java.net.http.HttpClient

  • 首选协议版本( HTTP/1.1 或 HTTP/2 )
  • 是否跟随重定向
  • 代理
  • 身份验证器
HttpClient client = HttpClient.newBuilder()
                // 首选协议版本 默认情况下,客户端将使用 HTTP/2发送请求。发送到尚不支持 HTTP/2的服务器的请求将自动降级为HTTP/1.1。
                .version(HttpClient.Version.HTTP_2)
                // 重定向策略
                .followRedirects(HttpClient.Redirect.NORMAL)
                // 代理
                .proxy(ProxySelector.of(new InetSocketAddress("www-proxy.com", 8080)))
                // 超时时间
                .connectTimeout(Duration.ofSeconds(6))
                .build();

        try {
            // 发送同步请求
            var response = client.send(request, HttpResponse.BodyHandlers.ofString());
            // 发送异步请求
            var future = client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
            var responseAsync = future.get();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }

直接使用默认设置发送请求

阅读全文...

springboot 自定义校验注解

spring-boot 参数校验 constraint-validator

自定义校验注解ConstraintValidator 不太合适,优化一下

maven

<!-- Validation -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

自定义校验注解

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 枚举校验注解
 *
 */
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValid {
    String message() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    /**
     * 目标枚举类
     */
    Class<?> target() default Class.class;

}

注解校验逻辑

阅读全文...

Spring cache + Redis LocalDateTime反序列化

spring-cache redis 序列化 localdatetime
/**
* DateTime格式化字符串
*/
private static final String DEFAULT_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

/**
* Date格式化字符串
*/
private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";

/**
* Time格式化字符串
*/
private static final String DEFAULT_TIME_PATTERN = "HH:mm:ss";

private RedisCacheConfiguration getRedisCacheConfiguration() {

    // 配置序列化(解决乱码的问题)
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            //Key序列化方式redisSerializer
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
            .disableCachingNullValues();
    return config;
}

/**
 * key 序列化
 *
 * @return
 */
private RedisSerializer<String> keySerializer() {
    return new StringRedisSerializer();
}

/**
 * 值采用JSON序列化
 *
 * @return
 */
private RedisSerializer<Object> valueSerializer() {
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    // 解决查询缓存转换异常的问题
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.activateDefaultTyping(new ObjectMapper().getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);

    // Java8日期日期处理 LocalTime,LocalDate,LocalDateTime
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATETIME_PATTERN)));
    javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)));
    javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)));
    javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATETIME_PATTERN)));
    javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_PATTERN)));
    javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_PATTERN)));
    om.registerModule(javaTimeModule);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    return jackson2JsonRedisSerializer;
}

Debian安装GraphicsMagick

graphicsmagick debian 图片处理

先安装一堆乱七八糟的库,具体是干啥的,我懒得细看,一股脑全装上去了

可以参考这两个链接

  1. http://www.graphicsmagick.org/README.html
  2. http://www.graphicsmagick.org/INSTALL-unix.html

GraphicsMagick debian packages

# 从数码相机读取原始图像。当使用通用 RAW 文件格式扩展名读取文件时,会自动调用 Dcraw。
apt install dcraw
apt install fonts-urw-base35
# 阅读 Postscript 或便携式文档格式 (PDF)。
apt install ghostscript
# 读取 HP-GL 图像格式。请注意,HPGL 是一种绘图仪文件格式。HP 打印机通常接受 PCL 格式而不是 HPGL 格式。Ghostscript(见上文)也是必需的。
apt install hp2xx
# 这玩意安装太慢了
apt install ttf-mscorefonts-installer

apt install libbz2-dev
apt install libfreetype6-dev
apt install libjbig-dev
apt install liblcms2-dev
apt install liblzma-dev
apt install libpng-dev
apt install libtiff-dev
apt install libtool
apt install libwebp-dev
apt install libwmf-dev
apt install libx11-dev
apt install libxdmcp-dev
apt install libxext-dev
apt install libxft-dev
apt install libxml2-dev
apt install libxt-dev
apt install libzstd-dev
apt install zlib1g-dev
apt install libperl-dev

# heif图片支持
apt install libjpeg-dev
apt install libheif-dev
apt install libde265-dev

安装GraphicsMagick

有两种安装方法

阅读全文...

使用java终止office进程

word2pdf 进程管理 office

需要jdk大于等于1.8,否则需要重写convertStr()方法

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

@Slf4j
public class KillUtils {

    private static final String kill_wscript = "taskkill /f /t /im wscript.exe";
    private static final String kill_WINWORD = "taskkill /f /t /im WINWORD.exe";
    private static final String kill_POWERPNT = "taskkill /f /t /im POWERPNT.exe";
    private static final String kill_EXCEL = "taskkill /f /t /im EXCEL.exe";

    public static void main(String[] args) throws IOException {
        killOffice();
    }

    public static synchronized void killOffice() throws IOException {
        log.info("------------------------start------------------------");
        Process wscript = Runtime.getRuntime().exec(kill_wscript);
        Process winword = Runtime.getRuntime().exec(kill_WINWORD);
        Process powerpnt = Runtime.getRuntime().exec(kill_POWERPNT);
        Process excel = Runtime.getRuntime().exec(kill_EXCEL);

        convertStr(wscript, kill_wscript);
        convertStr(winword, kill_WINWORD);
        convertStr(powerpnt, kill_POWERPNT);
        convertStr(excel, kill_EXCEL);
        log.info("------------------------end------------------------");
    }

    private static void convertStr(Process process, String name) {
        String inputMsg = new BufferedReader(process.inputReader()).lines().collect(Collectors.joining("\n"));
        log.info(name + "--input:{}", inputMsg);
        String errorMsg = new BufferedReader(process.errorReader()).lines().collect(Collectors.joining("\n"));
        log.info(name + "--error:{}", errorMsg);
    }
}
Previous Page 2 of 4 Next Page