在任何人说使用公钥之前,这不是一个选项,因为我正在与客户服务器打交道。
我有一个脚本来维护一个文件,其中包含我客户服务器的所有 IP/用户名/密码。通过脚本,我选择了一个服务器并使用 here 文档来登录该服务器。
#### Code up here to set the variables.
exp_internal 1
/usr/bin/expect << EOFFF
if { $USE_TUNNEL == 1 } {
spawn ssh -L 4567:localhost:3306 $user\@$ip
} else {
spawn ssh $user\@$ip
}
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "$pass\r"
}
}
expect {
"$ " { send "<<<Send stuff>>>" }
"# " { send "<<<Send stuff>>>" }
}
interact
EOFFF
# End of bash script
Run Code Online (Sandbox Code Playgroud)
我的问题是,在 here 文档结束后,它会关闭 …
这将引发 ENOENT 错误:
const cmd = 'bash my/path/to/script.sh';
const process = spawn(cmd);
process.on('exit', (code) => {
console.log("Child exited");
});
Run Code Online (Sandbox Code Playgroud)
虽然这不会并按预期执行脚本:
const cmd = 'bash my/path/to/script.sh';
exec(cmd, function(err, stdout, stderr) {
console.log(stdout);
});
Run Code Online (Sandbox Code Playgroud)
现在,我想获取数据流spawn()并使其正常工作。这种行为可能来自哪里有什么建议吗?
我检查了一下pwd,两者的当前工作目录是相同的。
我正在生成一个线程来做一些工作。有时我希望这个线程在工作完成后死亡,其他时候我希望它等待更多的工作去做。为此,我传入了一个Option<Receiver<T>>. 如果Option<Receiver<T>>是None线程应该死,否则就应该等待接收更多的工作。
fn foo(rx: Option<Receiver<usize>>) {
thread::spawn(move || {
loop {
do_some_work();
if let Some(r) = rx {
match r.recv() {
Ok(x) => {}
Err(_) => panic!("Oh no!"),
}
} else {
break; //Die
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
(链接到操场)
编译器说:
fn foo(rx: Option<Receiver<usize>>) {
thread::spawn(move || {
loop {
do_some_work();
if let Some(r) = rx {
match r.recv() {
Ok(x) => {}
Err(_) => panic!("Oh no!"),
}
} else {
break; //Die …Run Code Online (Sandbox Code Playgroud) 在Node 的 Child Process spawn()function的文档以及我在其他地方看到的示例中,模式是调用该spawn()函数,然后在返回的对象上设置一堆处理程序ChildProcess。例如,这是spawn()该文档页面上给出的第一个示例:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
Run Code Online (Sandbox Code Playgroud)
该spawn()函数本身在第二行调用。我的理解是spawn()异步启动子进程。从文档中:
child_process.spawn() 方法使用给定命令生成一个新进程,并在 args 中使用命令行参数。
然而,上面脚本的以下几行继续为该进程设置各种处理程序,因此假设在spawn()第 2 行调用时间和其他事情发生之间该进程尚未实际启动(并且可能完成)随后的几行。我知道 JavaScript/Node 是单线程的。然而,操作系统不是单线程的,天真地人们会认为该spawn()调用是告诉操作系统立即生成进程(此时,不幸的是,操作系统可能会挂起父 Node 进程并运行/完成执行下一行 Node 代码之前的子进程)。
但一定是在当前 JavaScript 函数完成(或者更一般地说,调用当前函数的当前 JavaScript 事件处理程序完成)之前,该进程实际上不会生成,对吧? …
我有一个在 Windows 上使用 spawn 的简单脚本设置,其输出是:
spawn error: Error: spawn dir ENOENT
spawn child process closed with code -4058
Run Code Online (Sandbox Code Playgroud)
这是代码:
const spawn = require('child_process').spawn;
const spawnTest = (() => {
const dir = spawn('dir');
dir.stdout.on('data', (data) => {
console.log(`spawn stdout: ${data}`);
});
dir.stderr.on('data', (data) => {
console.log(`spawn stderr: ${data}`);
});
dir.on('error', (code) => {
console.log(`spawn error: ${code}`);
});
dir.on('close', (code) => {
console.log(`spawn child process closed with code ${code}`);
});
dir.on('exit', (code) => {
console.log(`spawn child process exited with code ${code}`); …Run Code Online (Sandbox Code Playgroud) 我在 Elixir 脚本中编写了一个模块 SC wget.exs,. 该模块SC 利用 Erlang 的操作系统模块来执行复杂的命令并将其输出打印在屏幕上。我在脚本中使用该模块一次下载多个包wget:
#!/usr/bin/env elixir\n\ndefmodule SC do\n def run(cmmnd) do\n output = :os.cmd(String.to_charlist(cmmnd)) \n IO.puts output\n end\nend\n\ndefmodule Downloader do\n def download_packages do\n lst_f_pckgs = "wget-list-sysv"\n\n #System.cmd("wget", ["https://www.linuxfromscratch.org/lfs/view/stable/#{lst_f_pckgs}"])\n SC.run("wget -c https://www.linuxfromscratch.org/lfs/view/stable/#{lst_f_pckgs}")\n \n {:ok, file_content} = File.read(lst_f_pckgs)\n arr_f_pckgs = String.split(file_content, ~r/\\s+/)\n\n tasks =\n arr_f_pckgs\n |> Enum.map(fn l ->\n #Task.async(fn -> System.cmd("wget", [l]) end)\n Task.async(fn -> SC.run("wget -c #{l}") end)\n end)\n\n tasks\n |> Enum.each(&Task.await/1)\n\n IO.puts "All of them are downloaded."\n …Run Code Online (Sandbox Code Playgroud) 我有一个servlet,它调用一个Web服务,并获取数据来填充servlet响应.我也不想等太久.我可以生成一个新线程并调用Web服务吗?如果不推荐这样做,有什么更好的方法?
谢谢
这是我简单的bash:
cat test.sh
#!/bin/bash
echo "hello"
su - root -c /path/to/script.sh <<EOF
password
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)
但我得到这个错误:
./test.sh
hello
su: must be run from a terminal
<current-user>
good bye
Run Code Online (Sandbox Code Playgroud)
(要么)
cat test2.sh
#!/bin/bash
echo "hello"
sudo su <<EOF
password
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)
又一次错误
(要么)
cat test3.sh
#!/bin/bash
echo "hello"
su root <<EOF
password
EOF
whoami
echo "good bye"
Run Code Online (Sandbox Code Playgroud)
再次出错......
当我尝试:
#!/bin/bash
echo "hello"
sudo -s <<EOF
<password>
echo Now I am root
id
echo "yes!"
EOF …Run Code Online (Sandbox Code Playgroud) 如何在Fortran中启动子进程(例如执行shell命令)?
在Node.js的,我们可以使用spawn或exec启动子进程:
var proc = require("child_process").spawn("ls", ["-l"]);
proc.stdout.on("data", function (chunk) {
console.log(chunk);
});
// or
var proc = require("child_process").exec("ls -l"], function (err, stdout, stderr) {
...
});
Run Code Online (Sandbox Code Playgroud)
上面的两个例子都运行ls -l(列出文件和目录).如何在Fortran中实现同样的目标?
以下程序崩溃.我究竟做错了什么?
#include <stdio.h>
#include <process.h>
int main() {
puts("Hello!");
return spawnlp(0, "notepad.exe", "notepad.exe", "test.txt");
}
Run Code Online (Sandbox Code Playgroud)