- PR -

ウィンドウにスクリーンセーバ起動はムリ!?

投稿者投稿内容
Pitch
常連さん
会議室デビュー日: 2005/11/14
投稿数: 44
投稿日時: 2005-11-15 17:03
先ほどの文章中、セーバーと書いてしまいましたが、ロックの間違いです。
ターミナルがロックして、再度パスワード投入でロック解除、といった感じです。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-11-15 17:03
スクリーンセーバーという単語に拘ると??なのですが、単に SSHで接続しているターミナルソフト、もしくは、接続先のサーバの PTY をロックしたいということではないか…、ということで決め打ちです。

まず前者 ( ターミナルソフトをロック ) に関しては、PuTTY, TeraTermPro, Poderosa では、ロック機能を見たことがありません。
結局はソフト次第なのですが、そういうソフトは無さそうでしょう…、というのが第一感です。

後者 ( サーバの PTYをロック ) に関しては、cn009 さんのコメントにあった vlock が使えそうですね。初めて知りました。
※ とはいえ、インストールしてみると…、vlock のプログラムファイルは SUID されていない…。root以外のユーザでロックしたら、どうやってパスワードを判定するのでしょう。

最後に。
「SSHログインしたウインドウ」って結局何でしょう??

追記:
投稿が前後してしまいました…。
一定時間でロックするというご希望ですか…。
では vlock は難しそうですね。シェルの autologout 機能と組み合わせれば何とかなりそうですが…。( でも autologout すると、中途の作業もご破算になるから意味ないか )

[ メッセージ編集済み 編集者: angel 編集日時 2005-11-15 17:20 ]
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-11-15 23:39
こんばんわ.
引用:

コブラさんの書き込み (2005-11-15 16:27) より:

後、 VNC Viewer かますとか色々ある訳ですけんども・・・>kaz氏

あ、これお呼びで無い?(笑)


あ,確かに.
それはそれでひとつの答えではないかと.

でも問題は terminal 限定なのですね? -> Pitch 様
であれば自分も angel 様同様無理だと感じます.
引用:

「SSHログインしたウインドウ」って結局何でしょう??


おそらく ssh client の「ウィンドウ」ではないかと.
cn009
ベテラン
会議室デビュー日: 2004/05/13
投稿数: 72
投稿日時: 2005-11-16 02:01
引用:

マルチ・ウィンドウ・モードの場合はちょっと面倒です。
「xlsclients -l」等でWindow IDを取得して、
それぞれに対してxlockを実行する必要があると思います。

例えば「xlsclients -l」でウィンドウの1つが、「Window 0x400003:」ということが分かった場合、
「xlock -mode blank -parent $(perl -e 'print hex("0x400003")')」とかを実行して、
一つ一つのウィンドウに対してxlockをかける必要があると思います。


というのは間違いでした。すみません。

xlock の -parent オプションは、スクリーンセーバーを表示するウィンドウを
指定するだけで、ロック自体は他のウィンドウにもかかりました。
xlock を多重起動しようとすると、キーボードの grab が出来ないというエラーが出ました。

引用:

※ とはいえ、インストールしてみると…、vlock のプログラムファイルは SUID されていない…。
root以外のユーザでロックしたら、どうやってパスワードを判定するのでしょう。


それはちょっと変ですね。
インストールの失敗だったり、パッケージのミスのような気が・・・
ちなみに、Gentoo の vlock は SUID されていました。


X Window System のロックなのか、sshクライアント等のCUI環境のロックなのか、どちらでしょうか? > Pitch様
どうもsshクライアント等のCUI環境の話のような気もしますが。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-11-17 08:50
自作の ttysaver.c (プ
シェアウェア(爆) にしたい。。。
コードの改変・改良は自由です (ププ

#define してある "password" の文字は好きに変えてや。
そんときは、配列末尾の NULL の場所も変えなならんけど・・・

コード:
#include <stdio.h>

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <termio.h>
#include <errno.h>

#define ON 1
#define OFF 0

#define PASSWD "password"

#define CLS "\033[1J"
#define HOME "\033[1H"
#define POS "\033[%d;%df"

#define COL 10
#define ROW 6

extern int errno;

void nop()
{
unechbk(OFF, 0);
exit(0);
}

void locktty()
{
static char step[ROW][COL] = {" ___",
" ( @)-",
" | |",
"/( )\\",
" | \\",
" /\\ |\\"};

static char hop[ROW][COL] = {" ___",
" ( @)-",
" | |",
" -( )-",
" / \\",
" /\\ |\\"};

static char walk[ROW][COL] = {" ___",
" ( @)-",
" | |",
"\\( )\\",
" / |",
" /\\ |\\"};

int i = 0;

while(1){
int ii = 0;

printf(CLS);
printf(HOME);

for(ii = 0; ii<ROW; ii++){
printf(POS, ii, i);
printf("%s\n", step[ii]);
}
usleep(327670);

printf(CLS);
printf(HOME);

i += 5;
if(i >= 80) i = 0;

for(ii = 0; ii<ROW; ii++){
printf(POS, ii, i);
printf("%s\n", hop[ii]);
}
usleep(327670);

printf(CLS);
printf(HOME);

i += 5;
if(i >= 80) i = 0;

for(ii = 0; ii<ROW; ii++){
printf(POS, ii, i);
printf("%s\n", walk[ii]);
}
usleep(327670);

i += 5;
if(i >= 80) i = 0;
}
}

int unechbk(int sw, int flds)
{
struct termio tmb;

if(ioctl(flds, TCGETA, &tmb) == EOF)
return errno;

if(sw == OFF) tmb.c_lflag |= ECHO;
else tmb.c_lflag &= ~ECHO;

if(ioctl(flds, TCSETA, &tmb) == EOF) return errno;

return 0;
}

main()
{
char buf[2048];
int pid = -1;

unechbk(ON, 0);
signal(SIGKILL, nop);
signal(SIGTSTP, SIG_IGN);
signal(SIGSTOP, nop);
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGILL, SIG_IGN);
signal(SIGTRAP, SIG_IGN);
signal(SIGABRT, SIG_IGN);
signal(SIGIOT, SIG_IGN);
signal(SIGFPE, SIG_IGN);
signal(SIGBUS, SIG_IGN);
signal(SIGSEGV, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
signal(SIGALRM, SIG_IGN);
signal(SIGTERM, SIG_IGN);
signal(SIGCHLD, nop);
signal(SIGPWR, SIG_IGN);

if(fork() == 0){
while(1){
memset(buf, 0x00, sizeof(buf));

if(fgets(buf, sizeof(buf), stdin))
if(buf[0] == 0x1a) continue;

if(strncmp(buf, PASSWD, 8) == 0)
if(buf[9] == 0x00){
unechbk(OFF, 0);
exit(0);
}
}
}
else {
locktty();
}

exit(0);
}



[ メッセージ編集済み 編集者: コブラ 編集日時 2005-11-21 04:15 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-11-17 19:54
ちょっと変えました。
なんぼ何でも #define はマズいわな (プ
ええと、実行前に root で chown +s ttysaver せんと仕様でコアダンプする。

後、^[[ の部分は、ちゃんと Ctrl + V の後エスケープ押したシーケンスを使わんと
崩れまっしゃろな・・・

MD5系の事を全く考えとらんかったので、MD5系の事も考慮するようにしました。

----------------------------------------------------------------------------
ttysaver.c

コード:
#include <stdio.h>

#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pwd.h>
#include <shadow.h>
#include <crypt.h>
#include <fcntl.h>
#include <signal.h>
#include <termio.h>
#include <errno.h>

#define ON 1
#define OFF 0

#define CLS "\033[1J"
#define HOME "\033[1H"
#define POS "\033[%d;%df"

#define COL 11
#define ROW 6

#define SALT_E 11

extern int errno;

void nop()
{
unechbk(OFF, 0);
exit(0);
}

void escshow()
{
static char step[ROW][COL] = {"^[[34m ___",
" ( @)-",
" | |",
"/( )\\",
" | \\",
" /\\ |\\"};

static char hop[ROW][COL] = {"^[[35m ___",
" ( @)-",
" | |",
" -( )-",
" / \\",
" /\\ |\\"};

static char walk[ROW][COL] = {"^[[36m ___",
" ( @)-",
" | |",
"\\( )\\",
" / |",
" /\\ |\\"};

int i = 0;

while(1){
int ii = 0;

printf(CLS);
printf(HOME);

for(ii = 0; ii<ROW; ii++){
printf(POS, ii, i);
printf("%s\n", step[ii]);
}
usleep(327670);

printf(CLS);
printf(HOME);

i += 5;
if(i >= 80) i = 0;

for(ii = 0; ii<ROW; ii++){
printf(POS, ii, i);
printf("%s\n", hop[ii]);
}
usleep(327670);

printf(CLS);
printf(HOME);

i += 5;
if(i >= 80) i = 0;

for(ii = 0; ii<ROW; ii++){
printf(POS, ii, i);
printf("%s\n", walk[ii]);
}
usleep(327670);

i += 5;
if(i >= 80) i = 0;
}
}

int unechbk(int sw, int flds)
{
struct termio tmb;

if(ioctl(flds, TCGETA, &tmb) == EOF)
return errno;

if(sw == OFF) tmb.c_lflag |= ECHO;
else tmb.c_lflag &= ~ECHO;

if(ioctl(flds, TCSETA, &tmb) == EOF) return errno;

return 0;
}

main()
{
char buf[2048];
char salt[SALT_E+1];
char *sp;
char *cp;
int pid = -1;
uid_t uid;
struct passwd *pass;
struct spwd *cipher;

unechbk(ON, 0);
signal(SIGKILL, nop);
signal(SIGTSTP, SIG_IGN);
signal(SIGSTOP, nop);
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGILL, SIG_IGN);
signal(SIGTRAP, SIG_IGN);
signal(SIGABRT, SIG_IGN);
signal(SIGIOT, SIG_IGN);
signal(SIGFPE, SIG_IGN);
signal(SIGBUS, SIG_IGN);
signal(SIGSEGV, SIG_IGN);
signal(SIGPIPE, SIG_IGN);
signal(SIGALRM, SIG_IGN);
signal(SIGTERM, SIG_IGN);
signal(SIGCHLD, nop);
signal(SIGPWR, SIG_IGN);

if(fork() == 0){
unsigned int ii;

uid = getuid();
pass = getpwuid(uid);
cipher = getspnam(pass->pw_name);
memset(salt, 0x00, sizeof(salt));

for(ii = 0; ii < SALT_E; ii++){
salt[ii] = *(cipher->sp_pwdp + ii);
}

sp = salt;

while(1){
memset(buf, 0x00, sizeof(buf));

if(fgets(buf, sizeof(buf), stdin) != NULL){
buf[strlen(buf) - 1] = 0x00;
cp = crypt(buf, sp);

if(strncmp(cp, cipher->sp_pwdp, strlen(cipher->sp_pwdp)) == 0){
unechbk(OFF, 0);
exit(0);
}
}
}
}
else {
escshow();
}

exit(0);
}



[ メッセージ編集済み 編集者: コブラ 編集日時 2005-11-21 04:16 ]

スキルアップ/キャリアアップ(JOB@IT)