Linux 服务如何使用 curl 利用 HTTP Get 请求传入 SQL 语句修改数据库表内容和结构
本文是博主在部署项目时发现的一个小技巧,项目部署在 Linux 虚拟机上,数据库被设置了写权限,作为开发只能使用程序对数据库做增删改查,但是在开发测试阶段会出现很多问题,权限的问题大大降低了开发效率,所以这个技巧会提高开发效率。
文章目录
- 1、项目依赖和代码
- 2、设置两条 SQL语句
- 3、SQL 语句改造
- 4、注意事项
- 5、扩展修改数据库表结构语句
1、项目依赖和代码
首先要部署项目确认是否可以使用 curl
。
本次项目是使用 SpringBoot 3 项目,使用方法调用 SQL 语句需要以下依赖:
<dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency><!-- MySQL 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>
核心代码如下:
package cn.com.wind.server.controller;import cn.com.wind.IMStarter.common.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
@RequestMapping("/system")
public class SystemController {private final JdbcTemplate jdbcTemplate;public SystemController(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@GetMapping("/operateDataBase")public Response<?> operateDataBase(@RequestParam("sql") String sql) {Map<String, Object> response = new HashMap<>();try {int result = jdbcTemplate.update(sql);response.put("status", "success");response.put("affectedRows", result);return Response.success(response);} catch (Exception e) {response.put("status", "error");response.put("message", e.getMessage());return Response.fail(400, "SQL 执行出错");}}
}
2、设置两条 SQL语句
使用数据库表 user_role
,在 user_database
下,表格字段有三个 uid
、name
、role
,下面使用来个常见的语句作为解析:
INSERT INTO user_database.user_role (uid, role) VALUES (100100, 0)
UPDATE user_database.user_role SET role=2 WHERE uid=100100
在 Linux 中使用 curl 要注意有些字符会被 Base 解释器解释错误,需要进行转译。
假设访问 IP 地址和端口如下所示:
http://localhost:8086/system/operateDataBase?sql=' '
3、SQL 语句改造
第一条 INSERT 语句如下:
curl 'http://localhost:8086/system/operateDataBase?sql=INSERT%20INTO%20user_database.user_role%20(uid, role)%20VALUES%20(110359024,0)'
后半部分如下:
INSERT%20INTO%20user_database.user_role%20(uid,role)%20VALUES%20(110359024,0)
第二条 UPDATE 语句如下:
curl 'http://localhost:8086/system/operateDataBase?sql=UPDATE%20user_database.user_role%20SET%20role=2%20WHERE%20uid=100100'
后半部分如下:
UPDATE%20user_database.user_role%20SET%20role=2%20WHERE%20uid=100100
4、注意事项
首先,语句中的空格要做对应的解析,user_database.user_role
这里面的 .
可以不使用转译字符代替。
%20
:空格%2E
:.
%27
:'
,最外层的地方的单引号不需要转译。
另外,在 curl
命令中,URL 中的 括号
和 逗号
不需要特别编码,但为了确保命令在 Bash 中正确解析,建议使用 单引号
或 双引号
将整个 URL 包裹起来。这样可以避免 Bash
对括号和逗号进行特殊处理。
- 单引号可以防止 Bash 对括号和逗号进行特殊处理。这是最简单和最安全的方法。
- 双引号也可以防止 Bash 对括号和逗号进行特殊处理,但需要注意 URL 中的特殊字符(如
$
)可能会被 Bash 解释。
我个人使用的单引号,可以满足使用要求。
在 INSERT 语句中,有的朋友喜欢在 ,
后面加一个空格,或者 =
后面加一个空格,这个时候也是需要使用 %20
转译。
INSERT%20INTO%20user_database.user_role%20(uid,%20role)%20VALUES%20(110359024,%200)
UPDATE%20user_database.user_role%20SET%20role%20=%202%20WHERE%20uid%20=%20100100
由于操作的数据库权限等级很高,建议使用者现在本地数据库做测试。
通过以上方法,你应该能够成功发送 curl
请求,而不会遇到 Bash 语法错误。
5、扩展修改数据库表结构语句
现阶段数据库表 user_database.user_role
只有 uid
一个主键,要将表中的 role
字段与现有的 uid
字段一起设置为主键,可以使用 ALTER TABLE
语句来修改表结构。
- 删除现有的主键:如果
uid
已经是主键,首先需要删除现有的主键。ALTER TABLE user_database.user_role DROP PRIMARY KEY;
- 添加新的复合主键:将
uid
和role
一起设置为复合主键。ALTER TABLE user_database.user_role ADD PRIMARY KEY (uid, role);
- 设置
role
不能为空ALTER TABLE private_quotation_db.user_role MODIFY role INT NOT NULL;
对应的 curl
命令
-
删除现有的主键:
curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20DROP%20PRIMARY%20KEY'
ALTER%20TABLE%20user_database.user_role%20DROP%20PRIMARY%20KEY
-
添加新的复合主键:
curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20ADD%20PRIMARY%20KEY%20(uid,%20role)'
ALTER%20TABLE%20user_database.user_role%20ADD%20PRIMARY%20KEY%20(uid,%20role)
-
设置
role
不能为空curl 'http://localhost:8086/system/operateDataBase?sql=ALTER%20TABLE%20user_database.user_role%20MODIFY%20role%20INT%20NOT%20NULL'
ALTER%20TABLE%20user_database.user_role%20MODIFY%20role%20INT%20NOT%20NULL
相信大家看完这篇内容之后,应该会使用这个技巧了,具体的语句不会写可以问以下对应的 AI 软件,祝大家开发愉快。