Bash:当 运行 shell 使用 node.js 命令在 linux 上生成时,没有这样的文件或目录
Bash: No such file or directory when running shell comands with node.js spawn on linux
我在 node.js 中使用可以 运行 shell 文件的 express 和 hbs 编写了以下 Web 服务器,但是当我键入此 url 进入网络浏览器
linux username here is replaced with my linux username
http://127.0.0.1:3000/run?file="/home/linux username here/nasServer/GameServers/minecraft/1.16.2 server/run.sh"
stderr: bash: <path to .sh file here>: No such file or directory.
child process exited with code 127.
nodejs 文件的内容:
const express = require('express')
const hbs = require('hbs')
const app = express()
const port = 3000
// Set up handlebars engine
app.set('view engine', 'hbs')
app.get('/run', (req, res) => {
const { spawn } = require('child_process');
let callback = ""
ls = spawn("bash", [req.query.file])
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code.toString());
});
res.send({
out: callback
})
})
app.listen(port, () => {
console.log(`App listening on port ${port}`)
})
这是run.sh的内容:
#!/bin/bash
java -Xmx5G -jar /home/linux username here/nasServer/GameServers/minecraft/1.16.2\ server/spigot-1.16.2.jar nogui
我通过将所有 windows 行结尾替换为 Unix 行结尾来解决问题,然后 bash 找到了 .sh 文件。
你好,我不知道为什么我决定尝试解决这个问题,因为我只知道一点编码(实际上只写脚本),对 nodeJs 一无所知,但我在测试你的应用程序的帮助下很有趣我的朋友 google !
首先,因为我没有你的 minecraft 文件(jar 等),我只是写了一个小脚本“test.sh”,它只会回应你的命令:
❯ cat test.sh
#!/bin/bash
echo "java -Xmx5G -jar /home/linux username here/nasServer/GameServers/minecraft/1.16.2\ server/spigot-1.16.2.jar nogui"
其次,经过 adding/deleting 大约 2 小时的培训、修改和测试后,将内容添加到您的应用程序中以了解其工作原理,当我发现它适用于此时,我终于回到了您的原始应用程序:
http://localhost:3000/run?file=test.sh
这是浏览器输出(符合预期):
{"out":""}
这里是控制台输出:
❯ node 71963151.js
App listening on port 3000
stdout: java -Xmx5G -jar /home/linux username here/nasServer/GameServers/minecraft/1.16.2\ server/spigot-1.16.2.jar nogui
child process exited with code 0
事实是,当我们从查询中删除双引号时它工作正常,但是当我像您尝试的那样加回双引号时:
http://localhost:3000/run?file="test.sh"
这是浏览器输出(符合预期):
{"out":""}
但这是控制台输出:
❯ node 71963151.js
App listening on port 3000
stderr: bash: "test.sh": No such file or directory
child process exited with code 127
所以,总而言之,不要在浏览器上尝试 运行:
http://127.0.0.1:3000/run?file="/home/<linux username here>/nasServer/GameServers/minecraft/<1.16.2 server>/run.sh"
试试这个:
http://127.0.0.1:3000/run?file=/home/<linux username here>/nasServer/GameServers/minecraft/<1.16.2 server>/run.sh
很多文档帮助我理解了 nodejs 的工作方式,我喜欢这样做 :p 谢谢,你让我想写代码!
bguess.
我在 node.js 中使用可以 运行 shell 文件的 express 和 hbs 编写了以下 Web 服务器,但是当我键入此 url 进入网络浏览器
linux username here is replaced with my linux username
http://127.0.0.1:3000/run?file="/home/linux username here/nasServer/GameServers/minecraft/1.16.2 server/run.sh"
stderr: bash: <path to .sh file here>: No such file or directory.
child process exited with code 127.
nodejs 文件的内容:
const express = require('express')
const hbs = require('hbs')
const app = express()
const port = 3000
// Set up handlebars engine
app.set('view engine', 'hbs')
app.get('/run', (req, res) => {
const { spawn } = require('child_process');
let callback = ""
ls = spawn("bash", [req.query.file])
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code.toString());
});
res.send({
out: callback
})
})
app.listen(port, () => {
console.log(`App listening on port ${port}`)
})
这是run.sh的内容:
#!/bin/bash
java -Xmx5G -jar /home/linux username here/nasServer/GameServers/minecraft/1.16.2\ server/spigot-1.16.2.jar nogui
我通过将所有 windows 行结尾替换为 Unix 行结尾来解决问题,然后 bash 找到了 .sh 文件。
你好,我不知道为什么我决定尝试解决这个问题,因为我只知道一点编码(实际上只写脚本),对 nodeJs 一无所知,但我在测试你的应用程序的帮助下很有趣我的朋友 google !
首先,因为我没有你的 minecraft 文件(jar 等),我只是写了一个小脚本“test.sh”,它只会回应你的命令:
❯ cat test.sh
#!/bin/bash
echo "java -Xmx5G -jar /home/linux username here/nasServer/GameServers/minecraft/1.16.2\ server/spigot-1.16.2.jar nogui"
其次,经过 adding/deleting 大约 2 小时的培训、修改和测试后,将内容添加到您的应用程序中以了解其工作原理,当我发现它适用于此时,我终于回到了您的原始应用程序:
http://localhost:3000/run?file=test.sh
这是浏览器输出(符合预期):
{"out":""}
这里是控制台输出:
❯ node 71963151.js
App listening on port 3000
stdout: java -Xmx5G -jar /home/linux username here/nasServer/GameServers/minecraft/1.16.2\ server/spigot-1.16.2.jar nogui
child process exited with code 0
事实是,当我们从查询中删除双引号时它工作正常,但是当我像您尝试的那样加回双引号时:
http://localhost:3000/run?file="test.sh"
这是浏览器输出(符合预期):
{"out":""}
但这是控制台输出:
❯ node 71963151.js
App listening on port 3000
stderr: bash: "test.sh": No such file or directory
child process exited with code 127
所以,总而言之,不要在浏览器上尝试 运行:
http://127.0.0.1:3000/run?file="/home/<linux username here>/nasServer/GameServers/minecraft/<1.16.2 server>/run.sh"
试试这个:
http://127.0.0.1:3000/run?file=/home/<linux username here>/nasServer/GameServers/minecraft/<1.16.2 server>/run.sh
很多文档帮助我理解了 nodejs 的工作方式,我喜欢这样做 :p 谢谢,你让我想写代码! bguess.