我通过我的Mac上的ssh连接在NetBSD系统上工作,我想使用该screen
实用程序,以便我可以启动进程并在终端连接中断后返回它们.当我输入时,screen
我收到错误消息:
Cannot find termcap entry for 'xterm-256color'
Run Code Online (Sandbox Code Playgroud)
浏览论坛帖子后,我认为它与远程机器上的termcap有关,但似乎并非如此; 我可以从另一台计算机的ssh会话中启动屏幕而没有任何错误,我通常无法访问该计算机.这表明我需要在本地计算机上配置一些东西,但我无法弄清楚是什么或如何.虽然这篇文章被标记为"gnu-screen"但我怀疑我正在使用Berkeley屏幕,尽管我不知道这是否是一个重要的区别.
我正在尝试确定机器接收数据包,处理数据包并给出答案所需的时间.
这台机器,我称之为"服务器",运行一个非常简单的程序,它recv(2)
在缓冲区中接收一个数据包(),将收到的内容(memcpy(3)
)复制到另一个缓冲区并发回数据包(send(2)
).服务器运行NetBSD 5.1.2.
我的客户多次测量往返时间(pkt_count
):
struct timespec start, end;
for(i = 0; i < pkt_count; ++i)
{
printf("%d ", i+1);
clock_gettime(CLOCK_MONOTONIC, &start);
send(sock, send_buf, pkt_size, 0);
recv(sock, recv_buf, pkt_size, 0);
clock_gettime(CLOCK_MONOTONIC, &end);
//struct timespec nsleep = {.tv_sec = 0, .tv_nsec = 100000};
//nanosleep(&nsleep, NULL);
printf("%.3f ", timespec_diff_usec(&end, &start));
}
Run Code Online (Sandbox Code Playgroud)
为清楚起见,我删除了错误检查和其他小问题.客户端运行在64位的Ubuntu 12.04上.两个程序都以实时优先级运行,尽管只有Ubuntu内核是实时的(-rt).程序之间的连接是TCP.这很好,平均给我750微秒.
但是,如果我启用已注释的nanosleep调用(睡眠时间为100μs),我的测量值会下降100μs,平均值为650μs.如果我睡眠200μs,则测量值降至550μs,依此类推.这一直持续到600μs的睡眠,平均为150μs.然后,如果我将睡眠时间提高到700μs,我的测量值平均会达到800μs.我用Wireshark证实了我的程序测量.
我无法弄清楚发生了什么.我已经在客户端和服务器中设置了TCP_NODELAY套接字选项,没有区别.我使用UDP,没有区别(相同的行为).所以我猜这种行为不是由于Nagle算法.会是什么呢?
[UPDATE]
这是客户端输出与Wireshark的截图.现在,我在另一台机器上运行我的服务器.我使用相同配置的相同操作系统(因为它是笔式驱动器中的Live System),但硬件不同.此行为未显示,一切按预期工作.但问题仍然存在:为什么它会在以前的硬件中发生?
[更新2:更多信息]
正如我之前所说,我在两台不同的服务器计算机上测试了我的一对程序(客户端/服务器).我绘制了两个获得的结果.
第一台服务器(奇怪的)是RTD单板计算机,具有1Gbps以太网接口.第二台服务器(普通服务器)是具有100Mbps以太网接口的Diamond单板计算机.他们都从SAME pendrive运行SAME OS(NetBSD 5.1.2).
从这些结果来看,我确实认为这种行为是由驱动程序或NIC本身引起的,尽管我仍然无法想象它为什么会发生......
查看"echo"命令的以下实现:
当你在列表中,我相信你会注意到每个实现中不断增长的膨胀.什么是点272线的回声计划?
我试图利用测试程序中的缓冲区溢出来执行任意代码。我在 NetBSD 6 i386 上。这是C代码:
int checkPassword(char *password)
{
char savePassword[64] = {0};
char *logMessage;
int isUser = 0;
int isAdmin = 0;
int i;
if (!strcmp(password, userPassword))
isUser = 1;
strcpy(savePassword, password);
for (i = 0; password[i]; ++i)
password[i] ^= xorKey;
if (!strcmp(password, adminPassword))
isAdmin = 1;
if (!(isAdmin | isUser)) {
/* ... */
}
return isAdmin ? ADMIN : isUser ? USER : NOBODY; /* main.c:79 */
}
Run Code Online (Sandbox Code Playgroud)
我将代码插入savePassword
缓冲区 (at %ebp - 0x58
)。下面是 GDB …
我编写了这个程序,应该以 exitcode 44 退出:
// prog.S
#include <sys/syscall.h>
.text
.globl _start
_start:
subl $8, %esp
pushl $44
pushl $0
movl $SYS_exit, %eax
int $0x80
Run Code Online (Sandbox Code Playgroud)
我编译了
$ cc prog.S -nostdlib -o a.out
Run Code Online (Sandbox Code Playgroud)
并运行
$./a.out
Run Code Online (Sandbox Code Playgroud)
在 FreeBSD 13.0-RELEASE i386 (clang 11.0.1) 上这样做效果很好。事实上,可执行文件运行并且程序的退出代码应该是 44。
但是,在 OpenBSD 7.0 GENERIC.MP#5 i386(clang 版本 11.1.0)和 NetBSD 9.2 i386(gcc 7.5.0)上执行相同操作时,内核拒绝执行代码,并将其传递给 shell,其中课程失败:
openbsd$ ./a.out
./a.out[1]: syntax error: `(' unexpected
Run Code Online (Sandbox Code Playgroud)
奇怪的是,该文件说它是一个 ELF 二进制文件,因此通常应该由内核执行
openbsd$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, not stripped …
Run Code Online (Sandbox Code Playgroud) 我为ruby编写了一个bash包装器,它经历了各种设置步骤.
最基本的版本是,
#!/bin/bash
# ruby_wrapper.sh
ruby
Run Code Online (Sandbox Code Playgroud)
现在我希望能够像常规红宝石一样使用这个包装器!具体来说,我想创建一个使用这个"解释器"的.rb文件.
#!/path/to/ruby_wrapper.sh
# my_file.rb
puts "hello world"
Run Code Online (Sandbox Code Playgroud)
所以我希望能够$ ./my_file.rb
而不是$ ruby_wrapper.sh my_file.rb
这可能吗?
该文件称事实并非如此.
请注意,解释器本身可能不是解释器脚本.
但我不明白为什么不.有没有人有任何想法来解决这个问题?
我正在使用Linux 2.6.38(fc14).什么是ioctl标志来获取套接字文件描述符(例如,TCP套接字)上的可用空间量?我发现NetBSD有FIONREAD,FIONWRITE和FIONSPACE用于此类相关目的.但是,我只能在Linux中使用FIONREAD.