我会接受一些写入的脚本的登录信息,以供许多用户使用.在python中,我将input_raw设置为从dev/tty读取,但是当我连接到通过ssh在服务器上运行的脚本时,它会失败.
思考?解决方法?
我宁愿避免将用户名硬编码到脚本中.
谢谢,麻烦您了.
所以我写了一个简单的html 1.0服务器,我在服务器上有一些perl脚本.特别是,我有一个名为直方图的脚本,这是一个带有表单操作的html表单,与另一个cgi文件相同.这是代码:
print "<form action=\"tallyandprint.cgi\" method=\"GET\">";
Run Code Online (Sandbox Code Playgroud)
现在,当我调用tallyandprint.cgi时,它会绘制一个带有gnuplot的图形并将其发送到用户的浏览器(STDOUT在html服务器代码中被重定向,因此perl会对其进行处理).现在,我也希望能够从bash运行tallyandprint.cgi,但采用不同风格的参数.现在,我使用perl解析通过解析url来抓取模式,并在+符号之间分隔内容(例如:?pattern = 1 + 2 + 3 + 4就是url).
这很好,花花公子,但我不希望我的论点用bash写成1 + 2 + 3 + 4,而是分开不同.我尝试使用perl的isatty()版本,但由于输入总是来自终端(因为服务器执行它),我无法区分输入是来自bash还是来自web浏览器.
我的下一步是找出STDOUT是否被重定向.因为如果web服务器运行cgi,STDOUT将被重定向到用户连接的套接字.如果在bash中运行,STDOUT应该是正常的tty.我怎样才能在perl中检查这个?
我作为守护进程运行的进程.我想使用信号重新加载配置.问题是,如果配置错误,它应该以tty形式发出错误信息.
如果不推荐的话.什么是更合适的方法来检查它是否成功?
我正在使用Debian操作系统.
我正在尝试在SSH会话下使用屏幕.但是当我试图运行命令时
screen
Run Code Online (Sandbox Code Playgroud)
shell回答我:
Must be connected to a Terminal.
Run Code Online (Sandbox Code Playgroud)
如果我进入
tty
Run Code Online (Sandbox Code Playgroud)
它回答我:
Not a tty
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,我试试
ssh -t login@server
Run Code Online (Sandbox Code Playgroud)
它不起作用..
请帮帮我,我真的需要这个!
谢谢
编辑:
我读了这个主题,但它仍然无效
我想打开一个伪tty,并使用生成的从属终端连接到子进程上的stdin / stdout。openPseudoTerminal给我一个IO (System.Posix.Types.Fd, System.Posix.Types.Fd),我试图将其转化为一对句柄(特定fdToHandle于GHC.IO.Handle.FdGHC,但我找不到其他这样的函数)。但是,我得到以下信息:
liftA (fdToHandle *** fdToHandle) openPseudoTerminal
Couldn't match type `System.Posix.Types.Fd'
with `System.Posix.Internals.FD'
Run Code Online (Sandbox Code Playgroud)
有什么想法可以在这两个(大概相似)的事物之间转换吗?
对于奖励积分,这将给我IO (IO Handle, IO Handle)-是否有一种巧妙的方法可以将其转换为IO (Handle, Handle)?
我想编写一个 x11 终端模拟器,但我不知道我应该如何生成并与 shell 通信,是否有任何基本的(伪或 C)代码?比如要创建什么样的 PTY,如何将 shell 绑定到它,我必须捕捉或发送什么信号,等等。并不是真的想对整个 xterm 源进行排序。
编辑:哦,我想实现一种与其中的任何应用程序进行通信的方式,我该如何进行功能发现?“客户端”中有一些隐藏的ansi序列,希望它不会与其他终端模拟器冲突?一些环境变量,希望它不会与“客户端”发生冲突或被 shell 删除?
我正在编写一些使用boost::asio类读取和写入串行设备的代码.但是,当在程序之间发送多个字符串时,我注意到在接收程序中,数据在写入串口时按顺序读取,而不是从其他程序发送数据 - 如果我开始读取数秒之后的数据,我不会得到我现在发送的值,而是之前发送的值.我假设这是由我如何设置我的boost::asio::serial_port:
int main(int argc, char const *argv[]){
int baud=atoi(argv[1]);
std::string pty=argv[2];
printf("Virtual device: %s\n",pty.data());
printf("Baud rate: %d\n",baud);
boost::asio::io_service io;
boost::asio::serial_port port(io, pty);
port.set_option(boost::asio::serial_port_base::baud_rate(baud));
// counter that writes to serial port in 1s intervals
int val=0;
while (1){
std::string data=std::to_string(val);
data+='\n';
std::cout << data;
write(port,boost::asio::buffer(data.c_str(),data.size()));
sleep(1);
val++;
data.clear();
}
port.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有一种方法可以在将新值发送到串行端口时强制将过去的数据丢弃(我假设应该在代码的write()部分完成)?
我有一个通过 hdmi 连接到我的电视的 pi。它设置为在启动时自动登录到控制台(不是 x-windows)。为了在我的电视上控制屏幕的输出,我必须使用连接到我的 pi 的键盘。
我希望能够通过 ssh 登录到 pi,然后劫持 tty1 stdin 流,但仍然允许 stdout 作为 hdmi 接口。我怎样才能做到这一点?
我查看了“屏幕”,但看起来它同时接管了标准输入和标准输出,而无法仅选择标准输入。
root@nana ~ # uname -a
Linux nana 3.4.104+ #1 SMP PREEMPT Thu Jan 8 15:40:40 CET 2015 armv7l GNU/Linux
Run Code Online (Sandbox Code Playgroud) 到现在为止,我已经花了至少10个小时试图了解Linus Akesson着名的博客文章,我仍然在苦苦挣扎.所以让我怀疑我对tty/ptty的怀疑是一系列简短的问题.
1)用户空间或内核空间中的tty/ptty是什么?
2)什么是tty/ptty与设备或驱动程序或某些编号或东西的连接?
3)tty似乎与某个过程的控制终端有关,什么是关系,是与终端相关的每个过程?
4)总的来说,我仍然不明白这个终端概念适合的位置.一个进程想要从stdio中读取一些内容,但它只是从所需的设备文件中读取它.tty打算如何解决这个问题究竟是什么?
5)我在某处读到有人试图将tty从用户空间移动到内核空间.这是一个历史性的残留物,而不是一个强大的设计特征.
如果我击运行一个程序,用于监听SIGWINCH,和我调整的是击在运行终端,然后程序会收到SIGWINCH。我想知道这个信号是如何传递给在 Bash 下运行的程序的。
这是我对发生的事情的理解,使用catch_sig我在本文末尾列出的示例程序:
catch_sig通过分叉作为子进程运行。该catch_sig进程继承了 Bash 的 I/O FD,也就是上面提到的 TTY。ioctl(pty_fd, TIOCSWINSZ, &size),pty_fd上面的 PTY 的发送端在哪里。此调用ioctl将更新接收 TTY 的大小,并将尝试发送SIGWINCHTTY 的进程组。catch_sig是上述进程组的一部分,因此分别SIGWINCH发送给他们两个。然而,我在上面遇到的一个困难是,如果我尝试SIGWINCH手动发送到 Bash 的进程组,kill则catch_sig不会收到信号。例如,如果 Bash 的 PID(和进程组)是123并且我catch_sig在其中运行,然后我kill -WINCH -123在单独的窗格中运行,则catch_sig不会收到信号。为什么会这样?
下面是一个演示catch_sig程序的源代码,如上所述:
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
static …Run Code Online (Sandbox Code Playgroud) tty ×10
linux ×6
ssh ×3
c++ ×2
pty ×2
bash ×1
boost ×1
boost-asio ×1
gnu-screen ×1
haskell ×1
linux-kernel ×1
perl ×1
python ×1
scripting ×1
serial-port ×1
signals ×1
stdout ×1