目录
1、介绍
1.1、Shell命令限制
在Shell命令中,特殊字符串可以引起一些问题,主要涉及到特殊字符的解释
、引号的使用
以及命令行长度的限制
。以下是一些常见的限制和注意事项:
- 特殊字符的解释: Shell中有一些特殊字符(例如$、&、*、|等),它们在命令中具有特殊的含义。如果在参数中使用这些字符,可能需要进行适当的转义或引用,以确保Shell正确解释它们。
- 引号的使用: 引号在Shell中用于保留参数的空格、防止变量替换等。单引号和双引号的使用方式有所不同。如果特殊字符串包含引号,需要注意正确使用引号以避免解释错误。
- 命令行长度限制: 命令行的长度是有限制的,由系统的ARG_MAX(参数最大长度,linux控制台执行
getconf ARG_MAX
可以获取到)常量决定。如果命令行过长,可能会导致执行失败。在处理大量数据时,可以考虑使用脚本或其他方式传递参数。 - 通配符展开: 如果特殊字符串中包含通配符(例如*、?),Shell会尝试进行通配符展开。如果不希望发生展开,可以使用引号防止通配符被解释。
- 换行符: 如果特殊字符串包含换行符,可能会影响命令的执行。在命令行中使用多行参数时,需要小心处理。
- 变量替换: 特殊字符串中的变量替换可能会导致意外的结果,特别是在双引号中进行变量替换时。使用单引号或适当的转义字符可以避免这个问题。
总体而言,对于特殊字符串的处理需要小心,根据具体情况采取适当的转义或引用方式。这有助于确保Shell正确解释参数,避免意外的行为。
1.2、Base64 介绍
Base64编码是使用64个可打印ASCII字符(A-Z、a-z、0-9、+、/)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途,Base64索引表如下:
数值 | 字符 | 数值 | 字符 | 数值 | 字符 | 数值 | 字符 |
---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w |
1 | B | 17 | R | 33 | h | 49 | x |
2 | C | 18 | S | 34 | i | 50 | y |
3 | D | 19 | T | 35 | j | 51 | z |
4 | E | 20 | U | 36 | k | 52 | 0 |
5 | F | 21 | V | 37 | l | 53 | 1 |
6 | G | 22 | W | 38 | m | 54 | 2 |
7 | H | 23 | X | 39 | n | 55 | 3 |
8 | I | 24 | Y | 40 | o | 56 | 4 |
9 | J | 25 | Z | 41 | p | 57 | 5 |
10 | K | 26 | a | 42 | q | 58 | 6 |
11 | L | 27 | b | 43 | r | 59 | 7 |
12 | M | 28 | c | 44 | s | 60 | 8 |
13 | N | 29 | d | 45 | t | 61 | 9 |
14 | O | 30 | e | 46 | u | 62 | + |
15 | P | 31 | f | 47 | v | 63 | / |
Base64可用于任意数据
的底层二进制数据
编码,以应用于只能传输ASCII字符的场合。不过最常用于文本数据的处理传输,例如在MIME格式的电子邮件中,Base64可以用来编码邮件内容,方便在不同语言计算机间传输而不乱码,注意是传输
而不是显示
,例如在西欧地区计算机上使用utf-8编码即可正常显示中文(安装有对应字库),但是它未必能正常传输中文,这时转换为Base64便无此顾虑。
1.3、传参思路
- 思路1:首先,计算
json字符串
的base64值
,然后,将计算得到的base64值
,通过shell命令行的方式传输给不同的开发语言程序
,最后,不同的开发语言程序
将接收到的base64值
通过自己编写的程序解码
便可以获取到原始的json字符串
。 - 思路2:首先,计算
json字符串
的base64值
,然后,将计算得到的base64值
,通过shell命令行+解码base64
的方式传输给不同的开发语言程序
,最后,不同的开发语言程序
便可以获取到原始的json字符串
(后续,将以该思路举例)。
2、测试案例
准备如下json字符串数据。
{
"整数":100,
"浮点数":99.99,
"布尔值":true,
"字符串":"Hello world\n",
"数组":[
"张三",
"李四",
"王五"
]
}
首先,前往 Base64在线生成网站 或者 通过程序(比如:Java语言org.springframework.util.Base64Utils.encodeToString方法)获取到该json的base64值,如下所示:
ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K
然后,在linux控制台使用echo base64值 | base64 --decode
命令行,测试是否成功解码该base64值
。(注释:大多数Linux系统都支持该base64
命令方式,它是一个用于进行Base64编码和解码的实用工具。base64
命令通常包含在核心的GNU工具集中,因此在许多常见的Linux发行版上都是可用的)
echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode
2.1、shell脚本(*.sh)
新建一个文件名为test.sh,内容如下:
#!/bin/bash
# 获取第一个参数
first_argument=$1
# 打印第一个参数
echo "第一个参数是: $first_argument"
在linux控制台(Terminal)执行如下shell命令,给test.sh传入json参数
sh test.sh "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"
在linux控制台(Terminal)显示结果如下:
2.2、java语言(*.java)
新建一个文件名为Test.java,内容如下:
public class Test {
public static void main(String[] args) {
System.out.println("第一个参数是:"+args[0]);
}
}
编译Test.java源代码为Test.class文件
javac Test.java
在linux控制台(Terminal)执行如下shell命令,给Test.class传入json参数
java Test "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"
在linux控制台(Terminal)显示结果如下:
2.3、c++语言(*.cpp)
新建一个文件名为test.cpp,内容如下:
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "第一个参数是: " << argv[1] << std::endl;
return 0;
}
编译test.cpp源代码为test.out文件
g++ test.cpp -o test.out
在linux控制台(Terminal)执行如下shell命令,给test.out传入json参数
./test.out "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"
在linux控制台(Terminal)显示结果如下:
2.3、python语言(*.py)
新建一个文件名为test.py,内容如下:
import sys
# 获取命令行参数
arguments = sys.argv
print("第一个参数是:", arguments[1])
在linux控制台(Terminal)执行如下shell命令,给test.py传入json参数
python3 test.py "$(echo ewogICAgIuaVtOaVsCI6MTAwLAogICAgIua1rueCueaVsCI6OTkuOTksCiAgICAi5biD5bCU5YC8Ijp0cnVlLAogICAgIuWtl+espuS4siI6IkhlbGxvIHdvcmxkXG4iLAogICAgIuaVsOe7hCI6WwogICAgICAgICLlvKDkuIkiLAogICAgICAgICLmnY7lm5siLAogICAgICAgICLnjovkupQiCiAgICBdCn0K | base64 --decode)"
在linux控制台(Terminal)显示结果如下: