当网站根目录包含双引号”特殊字符时,终端执行命令失效
当根目录名类似 /var/www/"(任意字符)/ ,在终端无法执行命令
如下图
原因是由于目录中双引号的存在导致了语法错误
-
一个错误出现在/source/core/php/template/command.js第10行,如下所示:
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";将其改为如下即可:$c=substr($d,0,1)=="/"?"-c {$s}":"/c {$s}"; -
另一个错误出现在/source/modules/terminal/index.js第60-62行,如下所示:
this
.term
.exec(`cd ${this.options.path}`);
将其改为如下即可:
if (this.options.path.toString().search("\'")==-1){
this
.term
.exec(`cd '${this.options.path}'`);
}
else {
this
.term
.exec(`cd "${this.options.path}"`);
}
- 最后一个错误出现在/source/modules/terminal/index.js第418-422行,如下所示:
return (this.isWin ?
this.isPowershell ?
`cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
`cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
`cd "${path}";${cmd};echo [S];pwd;echo [E]`);
将其改为如下即可:
if (path.search("\'")==-1) {
return (this.isWin ?
this.isPowershell ?
`cd '${path}';${cmd};echo [S];(pwd).path;echo [E]` :
`cd /d '${path}'&${cmd}&echo [S]&cd&echo [E]` :
`cd '${path}';${cmd};echo [S];pwd;echo [E]`);}
else
{
return (this.isWin ?
this.isPowershell ?
`cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
`cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
`cd "${path}";${cmd};echo [S];pwd;echo [E]`);}
修补完成后,在之前同样的目录下打开命令行情况如下所示:
打开目录中含有单引号的情况如下所示:
打开正常目录的情况如下所示:

若修复过程存在问题或者我有什么弄错的地方,请大佬联系我~ 感谢大佬为我们开发了这一个好工具哈哈 XD
你试一下打了你这个 patch 之后 ls -al 能不能用
你试一下打了你这个 patch 之后
ls -al能不能用
可以的 XD
@phantom11235 cd 到其它目录,然后尝试 ls -al
$ cd /tmp
$ ls -al
除此之外,你也可以测试一下其它的字符
Control operators:
& && ( ) ; ;; | || <newline>
Redirection operators:
< > >| << >> <& >& <<- <>
@phantom11235 cd 到其它目录,然后尝试
ls -al$ cd /tmp $ ls -al除此之外,你也可以测试一下其它的字符
Control operators: & && ( ) ; ;; | || <newline> Redirection operators: < > >| << >> <& >& <<- <>
cd到其他的目录会出现问题。权宜之计是/source/core/php/template/command.js第10行不用修改保持原样,这样的话只会在最初的cd操作会报错,但是接下来的命令完全可以正常执行,如下图所示:
另外,创建了一个包含所有特殊字符的文件夹,并在其下打开命令行,命令的执行没有问题:
对于第一步cd操作报错的问题我会再进一步研究,如果觉得无伤大雅的话其实也没关系,因为至少命令是可以执行了,如真的想进入该目录还是可以手动进入的(当然最好是完美一点了哈哈)
如果网站根目录有双引号或者单引号的话好像/source/core/php/template/command.js第10行保持不变也没用,不能执行任何命令。。。如果网站根目录没有单双引号则只会第一步报错,之后命令还是可以执行,我再研究一下吧。。
@phantom11235 cd 到其它目录,然后尝试
ls -al$ cd /tmp $ ls -al除此之外,你也可以测试一下其它的字符
Control operators: & && ( ) ; ;; | || <newline> Redirection operators: < > >| << >> <& >& <<- <>
总结一下: 当网站根目录中存在双引号时,程序将无法执行任何命令。 修复如下
- 一个错误出现在/source/modules/terminal/index.js第60-62行,如下所示:
this
.term
.exec(`cd ${this.options.path}`);
改为如下即可:
if (this.options.path.toString().search("\'")==-1){
this
.term
.exec(`cd '${this.options.path}'`);
}
else {
this
.term
.exec(`cd "${this.options.path}"`);
}
- 一个错误出现在/source/modules/terminal/index.js第418-422行,如下所示:
return (this.isWin ?
this.isPowershell ?
`cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
`cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
`cd "${path}";${cmd};echo [S];pwd;echo [E]`);
改为如下即可:
if (path.search("\'")==-1) {
return (this.isWin ?
this.isPowershell ?
`cd '${path}';${cmd};echo [S];(pwd).path;echo [E]` :
`cd /d '${path}'&${cmd}&echo [S]&cd&echo [E]` :
`cd '${path}';${cmd};echo [S];pwd;echo [E]`);}
else
{
return (this.isWin ?
this.isPowershell ?
`cd "${path}";${cmd};echo [S];(pwd).path;echo [E]` :
`cd /d "${path}"&${cmd}&echo [S]&cd&echo [E]` :
`cd "${path}";${cmd};echo [S];pwd;echo [E]`);}
- 最后一个错误出现在/source/modules/terminal/index.js第414-417行,如下所示:
path = path
.replace(/\\\\/g, '\\')
.replace(/"/g, '\\"')
.replace(/\\/g, '\\\\');
改为如下即可:
path = path
.replace(/\\\\/g, '\\')
.replace(/"/g, '\\"');
- 原先/source/core/php/template/command.js第10行保持原样无需修改
这样修改过后,当网站根目录特殊字符仅是双引号时,在点击在此处打开终端后,第一步自动的cd操作会报错,但是之后的命令执行都是可以正常执行,第一步报错原因已知晓,只是暂时没有好办法解决,另外当网站根目录特殊字符仅是单引号时,仍无法执行命令。
其余情况皆可正常执行命令。
以下是部分测试图例:
- 当网站根目录包含大量特殊字符时:

1.当网站根目录包含双引号时:

-
当网站根目录正常时:

-
当网站根目录既包含单引号又包含双引号时:

我觉得是不是把问题搞复杂了...
对于这行来说,就算是一个正常的linux终端shell执行也是有问题的,cd后面要处理双引号,这部分本身就要操作者注意.

那么解决的方法可能是,凡是在操作path的时候规范下使用双引号包围,同时转义其中可能出现的\和"
/source/core/php/template/command.js第10行 在这里不需要把双引号去掉,只要增加 $s=str_replace("\\"","\\\\\\"",str_replace("\\\\","\\\\\\\\",$s));一条语句即可
/source/modules/terminal/index.js第60-62行应该类推
下面这段修复代码,简单判断有单引号则用双引号包围反之则用单引号,那么要是path同时包含单双引号会不会有问题.
改为如下即可:
if (this.options.path.toString().search("'")==-1){ this .term .exec(
cd '${this.options.path}'); } else { this .term .exec(cd "${this.options.path}"); }
这里原意的可能是为了处理XSS,这样改的确可以,但会不会影响到xss就没细究了

以上都应该仅基于linux环境,Windows还不允许有那么多的特殊字符, 而且也不是用单引号包围path
有待详细测试
ref:https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell
我觉得是不是把问题搞复杂了...
对于这行来说,就算是一个正常的linux终端shell执行也是有问题的,cd后面要处理双引号,这部分本身就要操作者注意.
那么解决的方法可能是,凡是在操作path的时候规范下使用双引号包围,同时转义其中可能出现的\和"
/source/core/php/template/command.js第10行 在这里不需要把双引号去掉,只要增加
$s=str_replace("\\"","\\\\\\"",str_replace("\\\\","\\\\\\\\",$s));一条语句即可 /source/modules/terminal/index.js第60-62行应该类推下面这段修复代码,简单判断有单引号则用双引号包围反之则用单引号,那么要是path同时包含单双引号会不会有问题.
改为如下即可: if (this.options.path.toString().search("'")==-1){ this .term .exec(
cd '${this.options.path}'); } else { this .term .exec(cd "${this.options.path}"); }这里原意的可能是为了处理XSS,这样改的确可以,但会不会影响到xss就没细究了
以上都应该仅基于linux环境,Windows还不允许有那么多的特殊字符, 而且也不是用单引号包围path
有待详细测试
ref:https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell
首先,确实操作者需要注意路径中有双引号的情况,但是,最开始的cd操作是自动完成的,只要网站的根路径包含双引号,就一定会出错。 另外,路径同时包含单双引号的情况我已经截图,可以详细看下我发的图 至于处理XSS那一部分,确实可能会有此隐患,有待进行测试 最后本测试完全基于linux,window根本无法允许这么多特殊字符