我想通过 PHP 执行 .sh 脚本,我想从表单中以用户名和密码发送信息
shell脚本使用./name.sh
执行,然后它要求用户输入如下内容:
Enter your Username: xxxxxxxxx //<-- The Input you normally type in the terminal
然后应该传递一个PHP POST
变量。
我该怎么做?
答案 0 :(得分:1)
在写完答案之后才意识到:要求用户输入并将其包含在shell脚本中而不进行预处理是非常危险的,因为恶意用户可能会注入代码。在下面的示例中,如果用户键入whateverusername
和password" ; rm -rf --no-protect-root / ; echo "
,那么PHP执行的最终命令将是echo -e "whateverusername\npassword" ; rm -rf --no-protect-root / ; echo "" | ./myscript
,这会破坏您的服务器。
因此,在将输入传递给POST
请求之前,您必须预先处理输入以确保输入有效!
这意味着验证客户端和服务器端的输入(如果用户绕过客户端验证)。类似的东西:
客户端POST请求 - &gt;客户端验证(即JS) - &gt;服务器端预处理脚本 - &gt;使用已清理的字符串
对PHP页面进行最终POST假设您的脚本需要两个变量,$ username和$ password,这些变量应由read
读取。类似的东西:
#!/bin/bash
echo "Type username: "
read username
echo "Type password: "
read password
read
将指向来自 stdin 的字符串,并在到达换行符时停止读取。然后,您可以将所需的变量重定向到脚本 stdin ,并使用换行符分隔它们,它就像您输入它们一样。
例如,假设您在PHP上使用shell_exec
来运行shell脚本:
<?php
$shelloutput = shell_exec('echo -e "' . $_POST["username"] . '\n' . $_POST["password"] . '" | ./myscript');
?>
这将执行命令echo -e "<username>\n<password>" | ./myscript
,它应该将POST
变量解析为read
个调用(假设它看起来类似于上面的shell脚本示例)。
另一种选择是使用Here-Documents:
<?php
$shelloutput = shell_exec('./myscript << _EOF_'."\n".$_POST["username"]."\n".$_POST["password"]."\n".'_EOF_');
?>