【覚書】ロリポップ付属のphpmyadminにsshから接続するため悪魔の力を手に入れた話
スポンサードリンク
こんにちは。ふぁんたです。
前回の記事で、このWebページが有るサーバー「ロリポップ」付属のデータベースに無理やりつなげようとして全滅した、という話をしました。
今回は、悪魔に魂を売り、データベース接続に成功しましたので、そのやり方を書こうと思います。
[toc]
1.SSH接続する
2.MySQLでログインする
3.すっごーい!
という方法は、前回試しましたが、だめでした。
MySQL接続をするためのstring _conというコネクション情報を色々に弄り倒してみたんですけど、びくともしませんでした。
しかしながら、手入力すると成功してしまいました。解せぬ。
まず、コマンドプロンプトで
ssh ユーザー名@サーバーのホスト -p 2222
とすると、パスワードを聞かれるので、入れます。
そしたら、mysqlのCUIが出てくるので、
mysql -u データベースにおけるユーザー名 -h データベースがあるサーバー -p
とすると、パスワードを聞かれるので、今度はデータベースのパスワードを入れます。
なんと、接続できてしまいます。(ポートフォワーディングとは違うのかも?)
で、どのデータベースを使いたいかを指定するために、
use `データベースの名前`;
すると、SQL文でテーブルが操作できるようになります。
手作業の勝利。 プログラムの敗北。
できないんだそうです。なんてこった…
手入力では、できた。
プログラムでは、できなかった。
…「コマンドプロンプトにコマンドを入力するプログラム」にしてしまえばいいんじゃないか…?
C#のコードで、キーボードを叩くことを考えました。
これができれば、手入力と変わりない。
VBA(Excelのマクロとかのやつ)のdllを参照から読み込んで、キーボードを操作できるようにします。
それによって使える、SendKeysステートメント、というのがあります。
これは、引数にとったstringをキーボードで打ち込んだのと同じとみなせるような、そんな効果があります。
…それでも、パスワードを求められたときの入力ではうまくいきませんでした。
Sendkeysの力では、乗り越えられない困難があるようです。
もっと難しいのがありました。
keybd_eventというものです。
(キーをどのタイミングで押して、どのタイミングで離すか、というレベルまで指定することができる代わりに、めっちゃくちゃ操作が難解なやつです。)
これに手を出すことにしました。
(必要に応じて、プロジェクトを右クリック→追加→参照、として、必要なdllを参照してください)
使い方としては、KeyboardHandleクラスのインスタンスを作って、(new)
そのインスタンスを keyboardとすると、keyboard.input()の引数に、入力したい文字列を入れておくと、文字列の各文字に対して、キーボードをバーチャルで叩いて72ミリ秒待つ、というような使い方を想定しています。
今回、このコードに実装されてるのは、MySQLのCRUDで使いそうな文字だけとなってますので、例えば { とか、<とかを入力されると動きません。
普通はできないはずのところを、キーボードをシミュレートする という邪道な方法で、どうにか接続、SELECT * FROM table;を実行することができました。
あとは、tableの属性を変更して、それに合うようなInsert文をキーボードで入力させ、必要に応じてメニューから貼り付け機能を使えば、
「今日買うべき銘柄を毎日自動更新して教えてくれる」
ぜかましプロジェクトの集大成が出来上がると思うんです。
苦節1年2ヶ月、到達すべき点が見えてきました。
ラストスパート、がんばります。
前回の記事で、このWebページが有るサーバー「ロリポップ」付属のデータベースに無理やりつなげようとして全滅した、という話をしました。
今回は、悪魔に魂を売り、データベース接続に成功しましたので、そのやり方を書こうと思います。
[toc]
前回もやったSSHポートフォワーディング
1.SSH接続する
2.MySQLでログインする
3.すっごーい!
という方法は、前回試しましたが、だめでした。
MySQL接続をするためのstring _conというコネクション情報を色々に弄り倒してみたんですけど、びくともしませんでした。
手入力で成功
しかしながら、手入力すると成功してしまいました。解せぬ。
まず、コマンドプロンプトで
ssh ユーザー名@サーバーのホスト -p 2222
とすると、パスワードを聞かれるので、入れます。
そしたら、mysqlのCUIが出てくるので、
mysql -u データベースにおけるユーザー名 -h データベースがあるサーバー -p
とすると、パスワードを聞かれるので、今度はデータベースのパスワードを入れます。
なんと、接続できてしまいます。(ポートフォワーディングとは違うのかも?)
で、どのデータベースを使いたいかを指定するために、
use `データベースの名前`;
すると、SQL文でテーブルが操作できるようになります。
手作業の勝利。 プログラムの敗北。
そして知る絶望
モロ書いてあったわ…。https://t.co/iPVjSN5Lgv
>スタンダードプラン以上であればSSHを利用可能ですが、ポートフォワードによるデータベースへの接続は許可されていません。
? うどん提督 (@_udon) July 21, 2019
できないんだそうです。なんてこった…
悪魔との契約
手入力では、できた。
プログラムでは、できなかった。
…「コマンドプロンプトにコマンドを入力するプログラム」にしてしまえばいいんじゃないか…?
闇営業簡易版
C#のコードで、キーボードを叩くことを考えました。
これができれば、手入力と変わりない。
VBA(Excelのマクロとかのやつ)のdllを参照から読み込んで、キーボードを操作できるようにします。
それによって使える、SendKeysステートメント、というのがあります。
これは、引数にとったstringをキーボードで打ち込んだのと同じとみなせるような、そんな効果があります。
…それでも、パスワードを求められたときの入力ではうまくいきませんでした。
Sendkeysの力では、乗り越えられない困難があるようです。
闇営業複雑版
もっと難しいのがありました。
keybd_eventというものです。
(キーをどのタイミングで押して、どのタイミングで離すか、というレベルまで指定することができる代わりに、めっちゃくちゃ操作が難解なやつです。)
これに手を出すことにしました。
class KeyBoardHandle
{
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVK, byte bScan, byte dwFlags, int dsExtraiInfo);
public byte KeyDown = 0x0;
public byte KeyUp = 0x2;
public byte keyextend = 0x1;
public byte VK_LEFT = 0x25;
public byte VK_UP = 0x26;
public byte VK_RIGHT = 0x27;
public byte VK_DOWN = 0x28;
public byte VK_0 = 0x30;
public byte VK_1 = 0x31;
public byte VK_2 = 0x32;
public byte VK_3 = 0x33;
public byte VK_4 = 0x34;
public byte VK_5 = 0x35;
public byte VK_6 = 0x36;
public byte VK_7 = 0x37;
public byte VK_8 = 0x38;
public byte VK_9 = 0x39;
public byte VK_A = 0x41;
public byte VK_B = 0x42;
public byte VK_C = 0x43;
public byte VK_D = 0x44;
public byte VK_E = 0x45;
public byte VK_F = 0x46;
public byte VK_G = 0x47;
public byte VK_H = 0x48;
public byte VK_I = 0x49;
public byte VK_J = 0x4A;
public byte VK_K = 0x4B;
public byte VK_L = 0x4C;
public byte VK_M = 0x4D;
public byte VK_N = 0x4E;
public byte VK_O = 0x4F;
public byte VK_P = 0x50;
public byte VK_Q = 0x51;
public byte VK_R = 0x52;
public byte VK_S = 0x53;
public byte VK_T = 0x54;
public byte VK_U = 0x55;
public byte VK_V = 0x56;
public byte VK_W = 0x57;
public byte VK_X = 0x58;
public byte VK_Y = 0x59;
public byte VK_Z = 0x5A;
public byte VK_CONTROL = 0x11;
public byte VK_BACK = 0x8;
public byte VK_TAB = 0x9;
public byte VK_RETURN = 0xD;
public byte VK_PRINT = 0x2C;
public byte VK_Esc = 0x1B;
public byte VK_COLON = 0xBA;
public byte VK_MINUS = 0x6D;
public byte VK_DOT = 0x6E;
public byte VK_ATMARK = 0xC0;
public byte VK_SHIFT = 0x10;
public byte VK_SEMICOLON = 0xBB;
public void input(string s)
{
for (int i = 0; i < s.Length; i++)
{
inputOneChar(s[i]);
}
push(VK_RETURN);
}
public void inputOneChar(char c)
{
string s = c.ToString();
if (char.IsNumber(c))
{
push((byte)c);
}
else if (c >= 'A' && c <= 'Z')
{
pushcombi(VK_SHIFT, (byte)c);
}
else if (c >= 'a' && c <= 'z')
{
c = char.ToUpper(c);
push((byte)c);
}
else if (c == ' ')
{
push((byte)32);
;//space
}
else if (c == '@')
{
push(VK_ATMARK)
;//atmark
}
else if (c == '-')
{
push(VK_MINUS);
;//minus
}
else if (c == ';')
{
push(VK_SEMICOLON);
}
else if (c == '.')
{
push(VK_DOT);
}
else if (c == '`')
{
pushcombi(VK_SHIFT, VK_ATMARK);
}
else if (c == '*')
{
pushcombi(VK_SHIFT, VK_COLON);
}
else
{
;
}
}
public void push(byte key)
{
keybd_event(key, 0, KeyDown, 0);
keybd_event(key, 0, KeyUp, 0);
Thread.Sleep(72);
}
public void pushcombi(byte meta, byte key)
{
keybd_event(meta, 0, (byte)(KeyDown | keyextend), 0);
keybd_event(key, 0, (byte)(KeyDown | keyextend), 0);
keybd_event(key, 0, (byte)(KeyUp | keyextend), 0);
keybd_event(meta, 0, (byte)(KeyUp | keyextend), 0);
Thread.Sleep(72);
}
}
(必要に応じて、プロジェクトを右クリック→追加→参照、として、必要なdllを参照してください)
使い方としては、KeyboardHandleクラスのインスタンスを作って、(new)
そのインスタンスを keyboardとすると、keyboard.input()の引数に、入力したい文字列を入れておくと、文字列の各文字に対して、キーボードをバーチャルで叩いて72ミリ秒待つ、というような使い方を想定しています。
今回、このコードに実装されてるのは、MySQLのCRUDで使いそうな文字だけとなってますので、例えば { とか、<とかを入力されると動きません。
普通はできないはずのところを、キーボードをシミュレートする という邪道な方法で、どうにか接続、SELECT * FROM table;を実行することができました。
あとは、tableの属性を変更して、それに合うようなInsert文をキーボードで入力させ、必要に応じてメニューから貼り付け機能を使えば、
「今日買うべき銘柄を毎日自動更新して教えてくれる」
ぜかましプロジェクトの集大成が出来上がると思うんです。
苦節1年2ヶ月、到達すべき点が見えてきました。
ラストスパート、がんばります。
スポンサードリンク