The flip-flopping between "must have mode 777" and "must have mode 775" is caused by strace
.
screen
is usually a setuid or setgid program. It gains extra privileges when it is executed, which is uses to create socket files and/or modify utmp.
When a process is being traced, setuid and setgid are disabled. The tracing process, controlled by the less-privileged user, can take over the traced process so it must run without its extra privileges to avoid giving the original user too much power.
screen
detects whether it is being run with setuid privileges, setgid privileges, or neither, and adjusts its expectation of the directory permissions accordingly.
So this creates a class of problems that can't be easily debugged with strace
.
But if you're root, there is a workaround! If the tracing process is running as root, then the traced process can gain privileges normally. So here's what you do:
- Open 2 new terminals
- In the first terminal, log in to the remote machine as root
- In the second terminal, log in to the remote machine as normal user
- Use
ps
to get the PID of the normal user's shell process in the second terminal
- In the first terminal, run
strace -f -p SHELLPID
- In the second terminal, run screen and watch it fail
- In the first terminal, you now have the strace log you need to find out what's really wrong.
The key addition to the strace
command is the -f
option, which tells it to trace child processes. You need it to trace the screen that will be a child of the shell process you specified with -p
.
I also like to use -ff
and specify an output file with -o
, as in
strace -ff -o /tmp/screentrace -p SHELLPID
which will create a separate output file for each child process. Afterward you read them with less /tmp/screentrace*
and the result is usually cleaner than what you get using a single -f
.
UPDATE
Now that I've seen the strace output, I don't know exactly what went wrong, but this line is the most surprising thing in the trace:
chown("/dev/pts/2", 1002, 5) = -1 EPERM (Operation not permitted)
A few lines earlier, it created a pty, which was revealed by TIOCGPTN
to be number 2.
open("/dev/ptmx", O_RDWR) = 5
...
ioctl(5, TIOCGPTN, [2]) = 0
stat("/dev/pts/2", {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0
But it was unable to chown it. I don't know why that chown would fail, but the chown failure does give a plausible reason why screen gave up. You can get a little more information by adding -v
to the strace options, and looking at the stat
after the TIOCGPTN
to see who owns the /dev/pts/
entry.
Best Answer
Note that
screen
is a terminal emulator. So your question is a bit like asking how can I startxterm
fromgnome-terminal
and have what was last displayed inxterm
visible in mygnome-terminal
whenxterm
exits.Now the difference between
xterm
andscreen
is that whilexterm
uses the X protocol to draw its screen,screen
uses a host terminal.By default,
screen
will clear the screen of its host terminal to display its own emulated terminal and where available will use the alternate screen (before clearing) of that host terminal, so that upon termination, it can restore the host terminal state as it was before starting.So what you see is not
screen
clearing the screen upon leaving, but restoring the host terminal's main screen. The content of thescreen
window that was last displayed is still there on the alternate screen. Withxterm
, you can have a look at it by selecting Show alternate screen in the Ctrl+MiddleClick menu.If the host terminal doesn't support an alternate screen (like vt102 ones), it obviously can't do that. Instead, it does nothing, which is basically what you want.
So, what you can do is tell
screen
that the host terminal doesn't support an alternate screen. For that, you can add to~/.screenrc
:Which says: for all possible host terminals (
*
, matched against$TERM
), override thetermcap/terminfo
database to say that for those terminals, the escape sequences to enter or leave the alternate screen are the empty string.ti
andte
do not exactly mean alternate screen. From https://www.gnu.org/software/termutils/manual/termcap-1.3/html_node/termcap_39.html:But that translates to the alternate screen for most terminal emulators (specically, in
xterm
it's alternate screen and saving/restoring of the cursor position)